1.V8引擎如何回收垃圾
1.1 为什么要关注内存
- 防止页面占用内存过大,引起客户端卡顿、甚至无响应
- node使用的也是v8,内存对于后端服务的性能至关重要。因为服务的持久性,后端更容易造成内存溢出。
- 面试装逼神奇。
1.2 V8引擎内存回收机制
1.2.1 v8的内存分配
1.1.2 内存大小
- 在 64 位的机器上,默认最大操作的对象大小约为 1.4G,在 32 位的机器上,默认最大操作的对象大小约为 0.7G。
- 64位下新生代的空间为32MB,老生代为1400MB。
- 32位下新生代的空间为16MB,老生代为700MB
v8内存小的原因:
- js设计之初是为了浏览器,前端的特点-不持久化,执行一遍就回收了,1.4G完全够用;
- js回收内存的时候,会暂停执行;如果回收内存过大,可能会导致执行卡顿时间过长。
1.1.3 垃圾回收算法
- 新生代垃圾回收
- 新生代内存空间主要用来存放存活时间较短的对象;
- 新生代内存中的垃圾回收主要通过Scavenge算法进行,具体实现主要采用了Cheney算法。Cheney将内存空间一分为二,处于使用中的Semispace叫做From,处于闲置中的Semispace叫做To。
- 当我们分配对象时,先在From空间中进行分配;
- 在垃圾回收运行时,会检查From空间中的存活对象,这些存活对象将被复制到To空间中;而非存活对象占用的空间将会被释放。
- 完成复制后,From空间和To空间的角色发生对换。
- 最后进行垃圾回收时,会将To空间的内存进行释放。