印小龍 發表於 2025-11-17 17:34:00

V8的垃圾回收器

<h2 id="垃圾回收算法">垃圾回收算法</h2>
<ol>
<li>遍历 GC Root(window,DOM,栈等)标记活动对象和非活动对象</li>
<li>回收非活动对象所占据的内存</li>
<li>内存整理</li>
</ol>
<h2 id="新生代和老生代">新生代和老生代</h2>
<p>在 V8 中,会把堆分成新生代和老生代两个区域</p>
<ul>
<li>新生代通常只支持 1~8M 的容量,存放生存时间短的对象,由<strong>副垃圾回收器</strong>负责。</li>
<li>老生代通常容量很大,存放生存时间长的对象,由<strong>主垃圾回收器</strong>负责。</li>
</ul>
<h3 id="scavenge-算法新生代">Scavenge 算法(新生代)</h3>
<p>在新生代中被划分为对象区和空闲区,新加入的对象全部加入对象区,当对象区快被写满时,就要进行一次垃圾回收操作。</p>
<p><img src="https://img2024.cnblogs.com/blog/3537911/202511/3537911-20251117173259104-958982824.jpg" alt="233526686-e6ff7885-80c1-4fa5-86bf-b3367affc303" loading="lazy"></p>
<h3 id="回收过程">回收过程</h3>
<p><strong>因为要做频繁的复制操作,所以新生代一般设置容量较小。</strong></p>
<p>副垃圾回收器还会采用<strong>对象晋升策略</strong>,移动两次仍然还存在就把它移动到老生代中去。</p>
<p><img src="https://img2024.cnblogs.com/blog/3537911/202511/3537911-20251117173259019-809568644.jpg" alt="233526851-25448ec7-81e2-46c6-af5e-d59afaeed3aa" loading="lazy"></p>
<ol>
<li>垃圾标记</li>
<li>副垃圾回收器把活动对象复制到空闲区,整理</li>
<li>两个区做一次交换,对象区变成空闲区,空闲区变成对象区</li>
<li>抹掉空闲区</li>
</ol>
<h3 id="标记算法老生代">标记算法(老生代)</h3>
<ul>
<li>标记-清除从根开始遍历,标记那些不能被到达的元素,直接清除掉。会出现内存碎片所以接下来要整理操作。</li>
<li>标记-整理标记活动对象,将它们移动到一端,然后清理掉后面的内存。</li>
</ul>
<h2 id="垃圾回收器的优化">垃圾回收器的优化</h2>
<p>垃圾回收是运行在主线程上的,所以进行垃圾回收时,会造成卡顿。</p>
<ul>
<li>并行回收,开多个线程同时进行</li>
<li>增量回收,将垃圾收集分解成更小的颗粒,穿插的进行,一次只进行一小部分操作。</li>
<li>并发回收,在主线程内,辅助线程可以在后台完成垃圾回收操作。</li>
</ul>


</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:jinzhepro,转载请注明原文链接:https://www.cnblogs.com/jinzhepro/p/19233733</p><br><br>
来源:https://www.cnblogs.com/jinzhepro/p/19233733
頁: [1]
查看完整版本: V8的垃圾回收器