V8垃圾回收机制

本文探讨了V8引擎中的垃圾回收机制,包括其限制原因和分代式策略。新生代使用Scavenge算法,老生代则采用Mark-Sweep和Mark-Compact算法。对象在经历多次Scavenge回收且To空间占用超25%时晋升至老生代。这些机制旨在优化内存管理和性能。
摘要由CSDN通过智能技术生成

在V8中,所有Javascript对象都是通过堆来进行内存分配的,然而在Node中通过Javascript使用内存时就会发现只能使用部分内存。为什么会有这个限制呢?深层原因是V8的垃圾回收机制的限制。按照官方的说法,以1.5GB的垃圾回收堆内存为例,V8做一次小的垃圾回收需要50ms以上,做一次非增量式的垃圾回收甚至要1s以上。这是垃圾回收中引起Javascript线程暂停执行的时间,在这样的花销下,应用的性男女和响应能力都会直线下降。所以能直接限制堆内存是一个很好的选择。

V8垃圾回收机制

在介绍垃圾回收机制之前,我们先来谈谈垃圾回收策略。

v8的垃圾回收策略是基于分代式垃圾回收机制。在实际应用中,对象的生存周期长短不一·,不同的算法只能针对特定情况具有最好的效果。为此,现代的垃圾回收算法中按对象的存活时间将内存的垃圾回收进行不同的分代,然后分别对不同分代的内存施以更高效的算法。

  • v8内存分代

在v8中,主要将内存分为新生代和老生代两代。新生代中的对象为存活较短的对象,老生代中的对象存活时间较长。

v8堆的整体大小就是新生代所用内存空间加上老生代的内存空间。

  • Scavenge算法(新生代)

新生代中的对象主要通过Scavenge算法进行垃圾回收。

它将堆内存一分为二,在这两个空间中,只有一个属于使用状态,而另一个属于空闲状态。处于使用状态的空间称From空间,处于空闲状态的空间称为To空间。当我们分配对象的时候,先是在From空间中进行分配。当开始垃圾回收时,会检查From空间中的存活对象,将这些存活对象复制到To空间,而非存活对象占用的空间将会被释放。完成复制后,From空间和To空间的角色发生对换。

当一个对象经过多次复制依然存在时,它将被认为是生命周期较长的对象,即晋升成老生代,采用新的算法进行管理。

对象晋升的条件主要有两个:

1.对象是否经历过Scavenge回收

2.To空间的内存占用是否超过限制(即25%)

设置25%这个限制的原因是To空间会变成From空间,如果占比过高这会对接下来的内存分配有影响。

  • Mark-Sweep & Mark-Compact(老生代)

​​​​​​​老生代的垃圾回收主要有两个阶段:Mark-Sweep标记清除和Mark-Compact标记整理

Mark-Sweep在标记阶段遍历遍历堆中的所有对象,并标记活着的对象,在随后的清除阶段中,只清除没有被标记的对象。然而Mark-Sweep在一次回收之后,内存空间会出现不连续的状态,这会对后续内存的内存分配造成影响,因为可能出现需要分配一个大对象的情况,这时的碎片空间会无法啊完成此次分配,就会提前触发垃圾回收,而这次回收是不必要的。

为了解决Mark-Sweep造成的内存碎片问题,Mark-Compact标记整理被提出。在这个过程中,将存活对象向一端移动,移动完成后,直接清理掉边界外的内存。

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值