Javascript 如何清除已关闭的RTPEERCONNECTION>&燃气轮机;[解决方法]

Javascript 如何清除已关闭的RTPEERCONNECTION>&燃气轮机;[解决方法],javascript,google-chrome,webrtc,microsoft-edge,chromium,Javascript,Google Chrome,Webrtc,Microsoft Edge,Chromium,这是一个古老而著名的Chromium bug: 错误是:无法构造“rtpeerconnection”:无法创建如此多的peerconnection 现在因为Edge是基于Chrome的,不仅Chrome会受到这个bug的影响,这使得事情变得更糟 我们需要找到一种方法来强制垃圾收集器循环 我发布了我当前的解决方案,但我很高兴找到更好的解决方案,如果有的话…?经过一段时间的努力,我发现强制/调用垃圾收集器的最佳解决方案是创建然后撤销一些数据缓冲区 Chrome/Edge上最简单的修复方法是使用: U

这是一个古老而著名的Chromium bug:

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

现在因为Edge是基于Chrome的,不仅Chrome会受到这个bug的影响,这使得事情变得更糟

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


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

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

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

URL.revokeObjectURL(URL.createObjectURL(new Blob([new ArrayBuffer(5e+7)]))) // 50Mo buffer
但是那么,这将在Firefox上引入内存泄漏。 在Firefox上,如果不绑定到DOM元素,ObjectURL似乎无法被撤销。在中找不到关于它的任何信息

因此,跨浏览器解决方案(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;
函数peer(){
var peer=新的RTCPeerConnection();
设置超时(()=>{
peer.close();
对等=空;
}, 10);
console.log(i++);
如果(!(i%20)){
//尝试在每个20ish迭代中调用GC
queueMicrotask(()=>{
设img=document.createElement(“img”);
img.src=window.URL.createObjectURL(新Blob([new ArrayBuffer(5e+7)]);//50Mo或更少或更多,具体取决于您希望强制/调用GC循环运行
img.onerror=函数(){
window.URL.revokeObjectURL(this.src);
img=null
}
})
}
}

设置间隔(对等,20)如果您可以控制chromium进程,那么实际上可以将垃圾收集器公开给javascript。请参阅此答案的编辑

编辑声明您可以将
--js flags=“--expose gc”
添加到启动标志中。然后,它将公开一个名为
gc
的全局函数,可以调用该函数来调用垃圾收集器

我试着使用这个解决方案。但这似乎会导致我的嵌入式raspberry pi项目内存泄漏。

您能否将其添加到chrome问题的解决方案中(很糟糕,但如果它能工作…)?