JVM垃圾收集器简介

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

前言

在前面的文章中我们讲了java内存中的分区,下面我们就来讲一下JVM的垃圾收集原理。 image.png

感兴趣的朋友可以去看看:JAVA的内存简介

1.内存回收简介

Java 的⾃动内存管理主要是针对对象内存的回收和对象内存的分配。而对象都是存储在中的,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)同时,Java ⾃动内存管理 最核⼼的功能是内存中对象的分配与回收。Java 堆是垃圾收集器管理的主要区域,因此我们也称它为GC堆(Garbage Collected Heap)。

java的堆中主要分为年轻代和老年代。

年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。他们默认大小比例为8:1。年轻代使用复制-清除算法和并行收集器进行垃圾回收,对年轻代的垃圾回收称为初级回收(minor GC)

老年代中一般都是存活了很久的对象或者是比较大的对象(大对象创建时会直接放到老年代),在老年代发生的GC成为 Full GCFull GC 不会像 Minor GC那么频繁Full GC采用 标记-清除算法 收集垃圾的时候会产生许多内存碎片(不连续的存储空间),一般 Full GC 之前都会先进行Minor GC,目的时把新生代中的大对象或过期对象移动到老年代。

对象都会⾸先在 Eden 区域分配,在⼀次新⽣代垃圾回收后,如果对象还存活,则会进⼊ s0 或者 s1,紧接着进行GC,GC之后会将仍然存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置,默认为 15 岁)的对象会被移动到年老代中,如果年龄没有达到,则会将它放到另一个Survivor区。不管怎样,都会保证两块Survivor区的其中一块是空的,当其中一块填满或者GC时间到,则会触发GC进行垃圾回收。大家可以通过图片了解一下这个过程。

image.png

Guess you like

Origin juejin.im/post/7031173768831565838