2021.5.10日报:blink的gc问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值