amn*_*amn 12 javascript memory memory-leaks google-chrome web-mediarecorder
在尝试理解为什么我的某些Web应用程序的对象被Chrome保留在内存中后,我想我可能已经将其缩小到MediaRecorder
浏览器保留其他无法访问的对象的情况.请注意以下重现问题的最小示例:
new MediaRecorder(new MediaStream())
Run Code Online (Sandbox Code Playgroud)
我使用Chrome和Chromium中的Memory选项卡分析了堆的使用情况,并且MediaRecorder
堆上对象的存在并不是暂时的 - 只要我在上面执行之后在堆上找到它就会存在,它不会消失.
为什么会这样?没有任何东西可以保留它,这对我来说闻起来很像一个臭虫.相比之下,Firefox MediaRecorder
在适当的时候发布了对象,当然考虑到垃圾收集,至少它在我执行上面的语句之后甚至不在堆上,而不是在我拍摄它的快照时.
任何东西都没有引用媒体记录器对象,它应该具有它可能具有的最短寿命,但是在控制台被清除后我在快照中存在于内存中(开发人员工具for Chrome背后的开发人员建议先清理控制台)获取堆快照,因为前者可能会保留对象,否则将被释放).
我在MediaRecorder
类中找不到任何方法可以指示我可以将它与流解除关联或以其他方式"关闭"它.如果没有确定没有明显或不那么明显(例如通过事件监听器)的引用,我只能希望不保留匿名对象,而这些对象通常不会,但MediaRecorder
对象似乎是.对我来说似乎没有任何杠杆可以拉动处理一个,可以这么说.
您可以在下面的屏幕截图中看到哪些对象保留了介质记录器并不完全是我的脚本的一部分,它们似乎与某些内部浏览器状态有关:
在"构造函数"(The Constructor)列中选择的对象旁边的窗口图标具有工具提示"用户对象[是]可从窗口访问".上面的代码片段是我在选项卡中运行的唯一代码,为什么对象可以从窗口访问,如果是,它肯定不能是我管理的任何引用?
那么为什么保留这个对象呢?这里更大的问题是,如果我的应用程序启动许多录制并为每个录制创建一个新的媒体录制器对象,这些对象将继续堆积在内存中,这是事实上内存泄漏的情况.
就像我说的那样,我在Firefox 62.0.2中运行相同的语句,并且行为就像我期望的那样 - MediaRecorder
我创建的单个对象似乎超出了范围(因为它应该是如何没有引用它)它创建后不久.
(Chrome版本69.0.3497.100,Windows 10上的x64)
这已被证实是 Chromium 的问题(暗示 Google Chrome 以及可能其他 Chromium 衍生物,包括Electron):
https://bugs.chromium.org/p/chromium/issues/detail?id=899722
在撰写本文时,该问题被标记为“可用”,我认为这表明该问题已得到确认并有效地等待有人介入并修复。
归档时间: |
|
查看次数: |
445 次 |
最近记录: |