Me doy cuenta de que tanto en Google Chrome como en Microsoft Edge, los objetos Worker no se recolectan como basura. Después de ejecutar el siguiente caso de prueba simple e independiente, hacer un perfil de memoria y verificar la clase Worker muestra todos los objetos de trabajo como retenidos.
<html> <body> <div id="app"></div> <script> const js = 'var array = new Array(1024*1024).fill("Hello world")'; const blob = new Blob([js], { type: 'application/javascript' }); const wurl = URL.createObjectURL(blob); for(let i=1;i<=100;i++) { const w = new Worker(wurl); const result = { id: i }; document.getElementById('app').innerHTML = JSON.stringify(result); w.terminate(); } </script> </body> </html>
¿Cómo garantizar que los objetos de trabajo se liberen?
En la parte superior de mi cabeza, diría que su problema radica en la parte const w = new Worker...
Supongo que la limpieza de basura no se realiza porque el valor de w
no se puede reasignar y, en cualquier caso, la limpieza de bloques es irrelevante porque, para empezar, es un proceso independiente. Intente cambiarlo a var w = new Worker...
, dejando el resto sin cambios.