v8垃圾回收机制笔记(三)

90 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

一、如何判断新生代晋升到老生代

1、在from空间是否Scavenge回收过?(是否copy过一次)

2、是的话,To space已经使用了25%

符合这两个条件的话,那么新生代就会晋升到老生代。

二、v8是如何处理变量的(v8是如何处理内存)

1、内存查看 在浏览器开发模式的console,可以输入window.performance可以看到浏览器的内存情况

image.png

上图可以看到memory的jsHeapSizeLimitjs的限制使用内存,totalJSHeapSizejs总的内存。usedJSHeapSizejs已经使用了的内存。

image.png

上图在node查看内存使用,rss当前内存占用,heapTotal堆内存总占用,heapUsed堆内存已占用,external额外内存空间。

2、内存主要是存储变量等数据的

3、局部变量当程序执行结束,且没有引用的时候就会随着消失

4、全局对象会始终存活到程序运行结束

5、v8引擎优化

function getMemory() {
    let memory = process.memoryUsage()
    let format = function (bytes) {
        return `${(bytes1024/1024).toFixed(2)}MB`
    }
}

let count = 0
let useMem = () => {
    let size = 20 * 1024 * 1024
    let arr = new Array(size)
    console.log(count++)
    return arr
}

let total = []
for (let j = 0;j < 15; j++) {
    getMemory()
    total.push(useMem())
}

如上面的代码所示,运行会使内存报障,因为代码里定义了大量的全局变量,而全局变量不能被清除。那么可以解除内存大小的限制吗?答案是可以的,使用命令行改变变量大小。如node max-old-space-size=4096 build/build.js

老生代:max-old-space-size=4096MB

新生代:max-new-space-size=102400KM

这里要注意的是,两个的单位是不同的.node一般最多只能接受空闲内存的75%.

为了保证内存不溢出,还可以在应用层面,尽量使用局部变量去替代全局变量。