前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021.11.6日报:跟进v8 的gc流程的一些笔记

2021.11.6日报:跟进v8 的gc流程的一些笔记

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

1,v875的v8::PersistentHandleVisitor是可以把句柄全遍历出来的,但要想保持这些句柄长久不被gc回收,要在v8::EmbedderHeapTracer的AdvanceTracing里调用tracer->RegisterEmbedderReference。在v8::PersistentHandleVisitor里调用RegisterEmbedderReference是无效的。这个我研究了很久v8才知道。

2,v8::EmbedderHeapTracer::RegisterV8References会回调blink,告诉有哪些句柄需要blink确认是否要被回收。但这里有个大坑,就是RegisterV8References有时候返回的句柄数量不完整,也就是说有的对象是在上次RegisterV8References的时候通知过去,下次可能就不通知了。

新blink(比如57版本)的解决方案是blink通过ActiveScriptWrappableBase收集所有需要trace的对象,再用ActiveScriptWrappableBase::traceActiveScriptWrappables告诉blink的ScriptWrappableVisitor::RegisterV8Reference收集起来。此外ScriptWrappableVisitor::RegisterV8References(和上面那个函数只差了一个s)也会被v8回调,告诉v8有哪些句柄。

这些被收集起来的句柄,统一在ScriptWrappableVisitor::AdvanceTracing里调用tracer->RegisterEmbedderReference,告诉v8别回收这些句柄。

另外有个小插曲,V8PerIsolateData::m_activeScriptWrappables的数量减少是blink的gc自动进行的。

3,所以在老版本blink上要移植v875,我的解决方案是在RegisterV8References里收集了V8References后不删除,直到整个blink、v8的gc都结束了再销毁收集的V8References。

并没有采用ActiveScriptWrappableBase收集的方式。

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

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

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

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

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