上次说那个GC问题,没想到还有后续。
当时我那样改了以后,居然还是偶尔会被非正常gc掉。这就奇怪了。
仔细研究了下57版本的gc,发现确实和49不一样了。
57是给blink的每个引入v8的变量,搞了个基类:ActiveScriptWrappableBase
再到V8PerIsolateData管理了所有的ActiveScriptWrappableBase实例。1
然后在UnifiedHeapController::EnterFinalPause(这是个gc的某一阶段),blink遍历所有ActiveScriptWrappableBase实例,根据dispatchHasPendingActivity标记是否需要回收。
而49是V8GCController::traceDOMWrappers里,问v8所有的永久实例,然后看是否是ScriptWrappable,再看是否是HasPendingActivity,再标记是否回收。
这里有几个堆栈:
> node.dll!blink::V8GCController::gcPrologue(v8::Isolate * isolate, v8::GCType type, v8::GCCallbackFlags flags, void * data) 行 362 C++ 已加载符号。
node.dll!v8::internal::Heap::CallGCPrologueCallbacks(v8::GCType gc_type, v8::GCCallbackFlags flags) 行 1931 C++ 已加载符号。
node.dll!v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector collector, const v8::GCCallbackFlags gc_callback_flags) 行 1772 C++ 已加载符号。
node.dll!v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace space, v8::internal::GarbageCollectionReason gc_reason, const v8::GCCallbackFlags gc_callback_flags) 行 1387 C++ 已加载符号。
node.dll!v8::internal::Heap::CollectAllAvailableGarbage(v8::internal::GarbageCollectionReason gc_reason) 行 1222 C++ 已加载符号。
node.dll!v8::Isolate::LowMemoryNotification() 行 8700 C++ 已加载符号。
> node.dll!blink::UnifiedHeapController::EnterFinalPause(v8::EmbedderHeapTracer::EmbedderStackState stack_state) 行 89 C++ 已加载符号。
node.dll!v8::internal::LocalEmbedderHeapTracer::EnterFinalPause() 行 42 C++ 已加载符号。
node.dll!v8::internal::MarkCompactCollector::MarkLiveObjects() 行 1829 C++ 已加载符号。
node.dll!v8::internal::MarkCompactCollector::CollectGarbage() 行 503 C++ 已加载符号。
node.dll!v8::internal::Heap::MarkCompact() 行 1967 C++ 已加载符号。
node.dll!v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector collector, const v8::GCCallbackFlags gc_callback_flags) 行 1792 C++ 已加载符号。
node.dll!v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace space, v8::internal::GarbageCollectionReason gc_reason, const v8::GCCallbackFlags gc_callback_flags) 行 1387 C++ 已加载符号。
node.dll!v8::internal::Heap::CollectAllAvailableGarbage(v8::internal::GarbageCollectionReason gc_reason) 行 1222 C++ 已加载符号。
node.dll!v8::Isolate::LowMemoryNotification() 行 8700 C++ 已加载符号。
> node.dll!blink::UnifiedHeapController::RegisterV8References(const std::vector<std::pair<void *,void *>,std::allocator<std::pair<void *,void *>>> & internalFieldsOfPotentialWrappers) 行 127 C++ 已加载符号。
node.dll!v8::internal::LocalEmbedderHeapTracer::ProcessingScope::~ProcessingScope() 行 72 C++ 已加载符号。
node.dll!v8::internal::MarkCompactCollector::PerformWrapperTracing() 行 1690 C++ 已加载符号。
node.dll!v8::internal::MarkCompactCollector::MarkLiveObjects() 行 1862 C++ 已加载符号。
node.dll!v8::internal::MarkCompactCollector::CollectGarbage() 行 503 C++ 已加载符号。
node.dll!v8::internal::Heap::MarkCompact() 行 1967 C++ 已加载符号。
node.dll!v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector collector, const v8::GCCallbackFlags gc_callback_flags) 行 1792 C++ 已加载符号。
node.dll!v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace space, v8::internal::GarbageCollectionReason gc_reason, const v8::GCCallbackFlags gc_callback_flags) 行 1387 C++ 已加载符号。
node.dll!v8::internal::Heap::CollectAllAvailableGarbage(v8::internal::GarbageCollectionReason gc_reason) 行 1222 C++ 已加载符号。
node.dll!v8::Isolate::LowMemoryNotification() 行 8700 C++ 已加载符号。
顺序是:
Error: unrecognized flag --turbo
Try --help for options
WebPageImpl::init: 00F93028
MessageChannel: 5A726538
onLoadingFinish
BlinkPlatformImpl::doGarbageCollected 1
V8GCController::gcPrologue 1
V8GCController::gcPrologue 2
UnifiedHeapController::EnterFinalPause 1
UnifiedHeapController::EnterFinalPause 2
UnifiedHeapController::RegisterV8References: 79B5B028 30E62D98
UnifiedHeapController::RegisterV8References: 79B39390 20082148
UnifiedHeapController::RegisterV8References: 7A15C898 46622620
UnifiedHeapController::RegisterV8References: 7A15C898 46622620
UnifiedHeapController::RegisterV8References: 79B39390 20082148
V8GCController::gcPrologue 1
V8GCController::gcPrologue 2
V8GCController::gcEpilogue 1
V8GCController::gcEpilogue 2
V8GCController::gcEpilogue 1
V8GCController::traceDOMWrappers: 30E62D98
这里,还有个疑点我没分析清楚。就是我在V8GCController::gcPrologue里里,用VisitHandlesWithClassIds遍历所有句柄,居然偶尔会拿不到那个messageport