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
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击