zl程序教程

您现在的位置是:首页 >  其他

当前栏目

2021.5.10日报:blink的gc问题

2023-04-18 12:31:27 时间

上次说那个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