JVM垃圾回收三种算法
-
标记清理算法
标记清理算法,将堆内不在被使用的对象标记为垃圾对象,然后直接清理掉垃圾对象。
该算法的实现简单,但是容易产生内存碎片。
-
复制算法
复制算法,将堆内空间分成两个部分,一半的空间预留给整理活对象使用。将堆内不在被使用的对象标记为垃圾对象,然后将存活的对象复制到另外一半的空间中。
该算法内存只利用了一半,内存使用率不高,但是整理的效率高。
-
标记整理算法
标记整理算法,为了减少碎片和不浪费内存空间,将堆内不在被使用的对象标记为垃圾对象,清理掉垃圾对象,并且整理存活的对象。
JVM7种垃圾回收器
- 7种垃圾回收器:
新生代:Serial、 ParNew、Parallel Scavenge、老年代:CMS、 Serial Old 、Parallel Old、新生代+老年代:G1。
7种垃圾回收的搭配使用如下图:
其中,PS+PO 和PN+CMS 常用的两种组合方式。
- 可以设置JVM参数来进行垃圾回收器的搭配使用
- -XX:+UseSerialGC(年轻代:Serial + 老年代:Serial Old)
- -XX:+UseParNewGC(年轻代: Parallel Scavenge + 老年代:Serial Old)
- -XX:+UseParallelGC或-XX:+UseParallelOldGC(年轻代: ParNew + 老年代:ParallelOld)是常用的一种JVM垃圾回收组合方式。
- -XX:+UseConcMarkSweepGC(年轻代: ParNew + 老年代:CMS +Serial Old)也是一种常用的JVM垃圾回收组合方式
- G1
垃圾回收第一个阶段Young Collection
1、在新生代时,会触发进行GC roots 直接关联的存活对象的初始标记;
2、新生代内存紧张,就会执行垃圾回收操作,然后把新生代幸存的对象复制到幸存区;
3、当幸存区比较紧张时,触发垃圾回收操作,将幸存区中存活久的对象晋级到老年代,旧的幸存区中的存活对象和新生代存活的对象会被复制到新的幸存区中;
垃圾回收第二个阶段 Young Collection + CM
当老年代总的堆空间的比例达到阈值时,会进行并发标记;
垃圾回收的第三个阶段:Mixed Collection
在进行老年代垃圾回收的时候,为了使得STW的时间小于MaxGCPauseMillis这个目标,不是所有的老年代都发生拷贝,只会回收那些垃圾最多的老年代区域。