【发布时间】:2018-11-10 17:07:19
【问题描述】:
应该如何清理 web-audio-api AudioNode 以释放其内存?我根据this post 调用oscillatorNode.stop() 和oscillatorNode.disconnect(),但它似乎没有帮助,最终导致内存泄漏。 This post 不适用,因为我会在停止振荡器节点后立即删除引用。
我创建了一个显示问题的示例网站。以下是重现的步骤。
- 创建一个本地 html 文件,并在打开开发工具的台式机或笔记本电脑上以 chrome 运行以下代码 sn-p。
- 创建堆快照。
- 点击“开始”按钮。
- 定期创建另一个堆快照。
- 请注意,即使在运行垃圾收集器之后,内存也会不断增加。 为什么?
<html>
<body>
<button onclick="go()">Go</button>
<button onclick="cancel=true">Cancel</button>
<div id="status"></div>
<script>
var cancel = false;
var statusEl = document.getElementById('status');
async function go() {
cancel = false;
for (var i = 0; i < 100000; i++) {
if (cancel) {
return;
}
statusEl.innerHTML = i;
play();
await new Promise((resolve) => { setTimeout(resolve, 1); });
stop();
}
}
var ctx = new AudioContext();
var data = {
oscillatorNode: null
};
function play() {
if (!data.oscillatorNode) {
// create an oscillator
data.oscillatorNode = ctx.createOscillator();
data.oscillatorNode.frequency.value = 220.0;
data.oscillatorNode.connect(ctx.destination);
data.oscillatorNode.start(ctx.currentTime);
}
}
function stop() {
if (data.oscillatorNode) {
data.oscillatorNode.stop();
data.oscillatorNode.disconnect();
delete data.oscillatorNode;
}
}
</script>
</body>
</html>
【问题讨论】:
-
Chrome 中的错误? bugs.chromium.org/p/chromium/issues/detail?id=717528
标签: javascript memory-leaks web-audio-api