gpt4 book ai didi

javascript - 如何清除关闭的 RTCPeerConnection >> [使用解决方法]

转载 作者:行者123 更新时间:2023-12-03 08:26:25 25 4
gpt4 key购买 nike

这是著名的 Chromium bug:https://bugs.chromium.org/p/chromium/issues/detail?id=825576

错误是:无法构造“RTCPeerConnection”:无法创建如此多的 PeerConnection

现在,由于 Edge 基于 Chromium,因此不仅 Chrome 受到此错误的影响,使情况变得更糟。

我们需要找到一种方法来强制垃圾收集器循环。

我发布了当前的解决方法,但我很高兴找到更好的解决方法(如果有的话)...?

最佳答案

经过一段时间的尝试后,我发现强制/调用垃圾收集器的最佳解决方法是创建然后撤销一些数据缓冲区。

Chrome/Edge 上最简单的修复方法是使用:

URL.revokeObjectURL(URL.createObjectURL(new Blob([new ArrayBuffer(5e+7)]))) // 50Mo buffer

但是那么,这会在 Firefox 上引入内存泄漏。在 Firefox 上,如果不绑定(bind)到 DOM 元素,ObjectURL 似乎无法撤销。在 spec 中找不到任何有关它的信息。 .

因此跨浏览器解决方案(Chrome/Edge/Firefox,其他浏览器未测试)将是:

queueMicrotask(() => { // || >> requestIdleCallback
let img = document.createElement("img");
img.src = window.URL.createObjectURL(new Blob([new ArrayBuffer(5e+7)])); // 50Mo
img.onerror = function() {
window.URL.revokeObjectURL(this.src);
img = null
}
})

这是修复 WebRTC 错误的示例工作代码:

var i = 1;

function peer() {
var peer = new RTCPeerConnection();
setTimeout(() => {
peer.close();
peer = null;
}, 10);
console.log(i++);
if (!(i % 20)) {
// try to invoke GC on each 20ish iteration
queueMicrotask(() => {
let img = document.createElement("img");
img.src = window.URL.createObjectURL(new Blob([new ArrayBuffer(5e+7)])); // 50Mo or less or more depending as you wish to force/invoke GC cycle run
img.onerror = function() {
window.URL.revokeObjectURL(this.src);
img = null
}
})
}
}

setInterval(peer, 20);

关于javascript - 如何清除关闭的 RTCPeerConnection >> [使用解决方法],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66546934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com