为什么JavaScript中变量arr无法被GC(垃圾回收)?
内存泄漏原因分析
这段代码里的arr无法被GC回收,核心原因是Chrome DevTools的调试追踪机制导致的意外引用持有:
- 代码中调用了
emptyFn(arr),虽然emptyFn是个空函数,没有使用传入的arr参数,但当你在Chrome中开启DevTools的内存监控(比如录制堆快照、使用内存分析工具)时,V8引擎会为了支持调试回溯,保留函数调用栈的快照数据,其中就包含了本次调用时传入的arr参数引用。 - 这个由调试机制生成的栈帧快照被DevTools持续持有,导致
arr始终存在可达引用,无法被垃圾回收器回收。 - 补充:代码中
invoke函数挂载到window的__options对象,其内部的回调函数并未引用arr,因此这部分不是内存泄漏的原因。
如果关闭DevTools或者在非调试环境下运行这段代码,arr会被正常回收。
内容的提问来源于stack exchange,提问作者geoffzhu
相关产品推荐
相关产品推荐

