前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021.5.10日报:blink的gc问题

2021.5.10日报:blink的gc问题

作者头像
龙泉寺扫地僧
发布2021-12-06 10:33:38
4170
发布2021-12-06 10:33:38
举报
文章被收录于专栏:盟主来了盟主来了

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-05-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档