OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 } | 101 } |
102 | 102 |
103 // Regarding a minor GC algorithm for DOM nodes, see this document: | 103 // Regarding a minor GC algorithm for DOM nodes, see this document: |
104 // https://docs.google.com/a/google.com/presentation/d/1uifwVYGNYTZDoGLyCb7sXa7g
49mWNMW2gaWvMN5NLk8/edit#slide=id.p | 104 // https://docs.google.com/a/google.com/presentation/d/1uifwVYGNYTZDoGLyCb7sXa7g
49mWNMW2gaWvMN5NLk8/edit#slide=id.p |
105 class MinorGCWrapperVisitor : public v8::PersistentHandleVisitor { | 105 class MinorGCWrapperVisitor : public v8::PersistentHandleVisitor { |
106 public: | 106 public: |
107 explicit MinorGCWrapperVisitor(v8::Isolate* isolate) | 107 explicit MinorGCWrapperVisitor(v8::Isolate* isolate) |
108 : m_isolate(isolate) | 108 : m_isolate(isolate) |
109 { } | 109 { } |
110 | 110 |
111 virtual void VisitPersistentHandle(v8::Persistent<v8::Value>* value, uint16_
t classId) OVERRIDE | 111 virtual void VisitPersistentHandle(v8::Persistent<v8::Value>* value, uint16_
t classId) override |
112 { | 112 { |
113 // A minor DOM GC can collect only Nodes. | 113 // A minor DOM GC can collect only Nodes. |
114 if (classId != WrapperTypeInfo::NodeClassId) | 114 if (classId != WrapperTypeInfo::NodeClassId) |
115 return; | 115 return; |
116 | 116 |
117 // To make minor GC cycle time bounded, we limit the number of wrappers
handled | 117 // To make minor GC cycle time bounded, we limit the number of wrappers
handled |
118 // by each minor GC cycle to 10000. This value was selected so that the
minor | 118 // by each minor GC cycle to 10000. This value was selected so that the
minor |
119 // GC cycle time is bounded to 20 ms in a case where the new space size | 119 // GC cycle time is bounded to 20 ms in a case where the new space size |
120 // is 16 MB and it is full of wrappers (which is almost the worst case). | 120 // is 16 MB and it is full of wrappers (which is almost the worst case). |
121 // Practically speaking, as far as I crawled real web applications, | 121 // Practically speaking, as far as I crawled real web applications, |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 | 245 |
246 class MajorGCWrapperVisitor : public v8::PersistentHandleVisitor { | 246 class MajorGCWrapperVisitor : public v8::PersistentHandleVisitor { |
247 public: | 247 public: |
248 explicit MajorGCWrapperVisitor(v8::Isolate* isolate, bool constructRetainedO
bjectInfos) | 248 explicit MajorGCWrapperVisitor(v8::Isolate* isolate, bool constructRetainedO
bjectInfos) |
249 : m_isolate(isolate) | 249 : m_isolate(isolate) |
250 , m_liveRootGroupIdSet(false) | 250 , m_liveRootGroupIdSet(false) |
251 , m_constructRetainedObjectInfos(constructRetainedObjectInfos) | 251 , m_constructRetainedObjectInfos(constructRetainedObjectInfos) |
252 { | 252 { |
253 } | 253 } |
254 | 254 |
255 virtual void VisitPersistentHandle(v8::Persistent<v8::Value>* value, uint16_
t classId) OVERRIDE | 255 virtual void VisitPersistentHandle(v8::Persistent<v8::Value>* value, uint16_
t classId) override |
256 { | 256 { |
257 if (classId != WrapperTypeInfo::NodeClassId && classId != WrapperTypeInf
o::ObjectClassId) | 257 if (classId != WrapperTypeInfo::NodeClassId && classId != WrapperTypeInf
o::ObjectClassId) |
258 return; | 258 return; |
259 | 259 |
260 // Casting to a Handle is safe here, since the Persistent doesn't get GC
d | 260 // Casting to a Handle is safe here, since the Persistent doesn't get GC
d |
261 // during the GC prologue. | 261 // during the GC prologue. |
262 ASSERT((*reinterpret_cast<v8::Handle<v8::Value>*>(value))->IsObject()); | 262 ASSERT((*reinterpret_cast<v8::Handle<v8::Value>*>(value))->IsObject()); |
263 v8::Handle<v8::Object>* wrapper = reinterpret_cast<v8::Handle<v8::Object
>*>(value); | 263 v8::Handle<v8::Object>* wrapper = reinterpret_cast<v8::Handle<v8::Object
>*>(value); |
264 ASSERT(V8DOMWrapper::isDOMWrapper(*wrapper)); | 264 ASSERT(V8DOMWrapper::isDOMWrapper(*wrapper)); |
265 | 265 |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 static size_t lastUsageReportedToV8 = 0; | 450 static size_t lastUsageReportedToV8 = 0; |
451 | 451 |
452 size_t currentUsage = Partitions::currentDOMMemoryUsage(); | 452 size_t currentUsage = Partitions::currentDOMMemoryUsage(); |
453 int64_t diff = static_cast<int64_t>(currentUsage) - static_cast<int64_t>(las
tUsageReportedToV8); | 453 int64_t diff = static_cast<int64_t>(currentUsage) - static_cast<int64_t>(las
tUsageReportedToV8); |
454 isolate->AdjustAmountOfExternalAllocatedMemory(diff); | 454 isolate->AdjustAmountOfExternalAllocatedMemory(diff); |
455 | 455 |
456 lastUsageReportedToV8 = currentUsage; | 456 lastUsageReportedToV8 = currentUsage; |
457 } | 457 } |
458 | 458 |
459 } // namespace blink | 459 } // namespace blink |
OLD | NEW |