一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
一、如何判断新生代晋升到老生代
1、在from空间是否Scavenge回收过?(是否copy过一次)
2、是的话,To space已经使用了25%
符合这两个条件的话,那么新生代就会晋升到老生代。
二、v8是如何处理变量的(v8是如何处理内存)
1、内存查看 在浏览器开发模式的console,可以输入window.performance可以看到浏览器的内存情况
上图可以看到memory的jsHeapSizeLimitjs的限制使用内存,totalJSHeapSizejs总的内存。usedJSHeapSizejs已经使用了的内存。
上图在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%.
为了保证内存不溢出,还可以在应用层面,尽量使用局部变量去替代全局变量。