【发布时间】:2019-06-04 21:43:23
【问题描述】:
问题
我开发了一个扩展程序,它可以拦截 Web 请求、获取 Web 请求所源自的 HTML 并对其进行处理。我已经使用 DOMParser 解析 HTML,我意识到 DOMParser 会导致大量内存泄漏问题,最终导致 chrome 扩展崩溃。
这是导致问题的代码。 https://gist.github.com/uche1/20929b6ece7d647250828c63e4a2ffd4
我尝试过的
开发工具记录的性能
我在拦截请求时记录了 chrome 扩展,我注意到当调用 DOMParser.parseFromString 方法时,创建的节点和文档越多,但未被销毁。
开发工具截图 https://i.imgur.com/pMY50kR.png
任务管理器内存占用
我查看了 chrome 上的任务管理器,发现它的内存占用量很大,不会随着时间的推移而减少(因为垃圾收集应该在一段时间后开始)。当内存占用过大时,扩展程序崩溃。
任务管理器内存占用截图 https://i.imgur.com/c8fLWCy.png
堆快照
我在堆的屏幕截图之前和之后拍摄了一些,我可以看到问题似乎源于分配的 HTMLDocuments 没有被垃圾收集。
快照(之前) https://i.imgur.com/Rg2CRi6.png
快照(之后) https://i.imgur.com/UQgLuT1.png
预期结果
我想了解为什么 DOMParser 会导致此类内存问题,为什么垃圾收集器没有清理它以及如何解决它。
谢谢
【问题讨论】:
-
这是全部代码吗?将 HTML 解析为
document变量后,您不会对其执行任何操作吗? -
@RandyCasburn 是的,解析后,我对文档不做任何事情。我试图将其设置为 null 以鼓励垃圾收集,但这不起作用。
-
请看我的回答。
-
然后将
parser设置为null。
标签: javascript browser google-chrome-extension memory-leaks domparser