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

2021.12.9日报:v875的gc机制小结

作者头像
龙泉寺扫地僧
发布2021-12-09 21:27:20
4360
发布2021-12-09 21:27:20
举报
文章被收录于专栏:盟主来了盟主来了

最近被v875的gc搞蒙了。做个总结。

1,v8::Persistent<T>的机制改了。如果用SetWeak设置了回收回调,那么如果在UnifiedHeapController::AdvanceTracing里不RegisterEmbedderReference的话,js如果也没引用,就会触发这个回收回调。57好像不会有这问题。这个变动,导致了一系列问题。

例如document.getElementById("test").addEventListener这种方式添加的监听器,就直接被回收了。

在57版本里,是有个ScriptWrappableVisitor::AdvanceTracing -》

Element::traceWrappers-》

EventTargScriptWrappableVisitor::pushToMarkingDeque

的trace wrap机制。这个会保证监听器不回收。

我一开始解决这问题,是想在VisitPersistentHandle里把所有v8::Persistent<T>都不回收(通过设置v8::Persistent<T>::SetWrapperClassId 的方式来识别)

后来发现ScriptState里的v8::Context也不回收了。

另外还有个小插曲,我发现v8::Persistent被析构还不行,得手动调用SetWeak、ClearWeak、Reset才行。

所以现在我的思路是在遍历node的时候,通过addReferencesForNodeWithEventListeners把这个node下面的监听器调用一下RegisterV8References。而刚才我还发现,49原来是在addReferencesForNodeWithEventListeners里调用isolate->SetReference导致引用的。

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

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

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

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

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