{ const data = new Uint8Array([0x01]); await input_writer.write(data); }En el ejemplo anterior, los 'datos' se pasan a una operación asíncrona y luego se excluyen inmediatamente. ¿Qué sucede con la memoria subyacente? ¿Se mantiene vivo hasta que la función asíncrona finaliza con él?
Al principio pensé que data solo se podían recolectar basura al final del bloque de código, pero parece que el motor de JavaScript es más inteligente de lo que pensaba.
De hecho, al ejecutar este fragmento:
class Test {} (async function() { const data = new Test; await write(data); console.log('never'); function write(data) { return new Promise(() => {}); } })(); Luego, al usar la pestaña "Memoria" para tomar una instantánea de la memoria, no aparece ninguna Test al buscarla.
Sin embargo, si prueba este fragmento y toma una nueva instantánea, la instancia se muestra porque esta implementación de write pasa data a setTimeout que mantiene una referencia a los data durante un tiempo determinado:
class Test {} (async function() { const data = new Test; await write(data); console.log('in a long time'); function write(data) { return new Promise(resolve => setTimeout(() => resolve(data), 999999999)); } })();Nota: tienes que pegarlo en tu consola para verlo en la instantánea de la memoria.
Como conclusión, si la write no tiene ningún efecto secundario que guarde una referencia en data , el motor de JavaScript (al menos Chrome) parece ser lo suficientemente inteligente como para determinar que data ya no se usarán incluso antes del final del bloque de código. lo que ayuda a borrar la memoria lo antes posible.