[软技能] 第1418天 什么时候会触发Minor GC?

143 阅读3分钟

JVM

在Java虚拟机的垃圾回收中,通常将堆内存划分为年轻代和老年代两个部分。

年轻代又分为Eden空间、Survivor0空间和Survivor1空间。Minor GC(Minor Garbage Collection)指的是对年轻代的垃圾回收,它的发生频率比较高,一般在新对象创建时,当Eden空间满时,就会触发Minor GC。

Minor GC的过程分为以下几步:

首先,将Eden空间和Survivor0空间中存活的对象复制到Survivor1空间中,同时对这些对象进行标记。

然后,清空Eden空间和Survivor0空间,释放这些区域中未存活的对象所占用的内存空间。

最后,将Survivor1空间中的存活对象复制回Eden空间或者老年代中。

Minor GC的特点是速度快,一般不会引起应用程序的停顿,因为年轻代的空间比较小,存活的对象一般比较少。如果Minor GC的效率比较高,那么垃圾回收的效果也会比较好。因此,在应用程序的运行过程中,需要根据具体情况对年轻代的大小进行调整,以达到最佳的性能。

V8

V8实现了精准式GC,GC算法采用了分代式垃圾回收机制。因此,V8将内存(堆)分为新生代和老生代两部分。

新生代算法

新生代中的对象一般存活时间较短,使用Scavenge GC算法。
在新生代空间中,内存空间分为两部分,分别为From空间和To空间。
在这两个空间中,必定有一个空间是使用的,另一个空间是空闲的。
新分配的对象会被放入From空间中,当From空间被占满时,新生代GC就会启动。
算法会检查From空间中存活的对象并复制到To空间中,如果失活的对象就会销毁。
当复制完成后将From空间和To空间互换,这样GC就结束了。

老生代算法

老生代中的对象一般存活时间较长且数量也多,使用了两个算法,分别是 标记清除算法标记压缩算法
在将算法前,先来说下什么情况下对象会出现在老生代空间中:
● 新生代中的对象是否已经经历过一次Scavenge算法,如果经历过的话,会将对象从新生代空间移到老生代空间。
● To空间的对象占比大于25%。在这种情况下,为了不影响到内存分配,会将对象从新生代空间移到老生代空间中。

以下情况会启动 标记清除算法
● 某一空间没有分块的时候
● 空间中对象超过一定限制
● 空间不能保证新生代中的对象移动时

清除对象后会造成堆内存出现碎片的情况,当碎片超过一定限制后会启动 压缩算法。在压缩过程中,将活的对象像一端移动,直到所有对象都移动完成然后清除不需要的内存。

扩展阅读

juejin.cn/post/720625…

www.yuque.com/shixin-5pls…

更多题目

github.com/haizlin/fe-…