一、GC类型
1. 什么是GC
GC(Garbage Collection),垃圾收集。
GC主要分为
Minor GC 和
Full GC(Major GC)。
2. Minor GC
新生代GC,指发生在新生代的垃圾收集动作。
3. Full GC / Major GC
老年代GC,指发生在老年代的垃圾收集动作,当出现Major GC时,一般也会伴有至少一次的Minor GC(并非绝对,例如Parallel Scavenge收集器会单独直接触发Major GC的机制)。Major GC的速度一般会比Minor GC慢十倍以上。
Java中的对象的实例都存放在堆中,所有的对象实例以及数组都要在堆上分配内存。(《深入理解JVM》p41)。
Java堆分为新生代和老年代。
其中新生代又细分为Eden区、From Survivor区、To Survivor区。
二、GC触发条件
1. Minor GC
当Eden区中没有足够空间进行分配时,将会触发一次Minor GC。
2. Full GC / Major GC
1).调用System.gc()方法会建议JVM进行Major GC,因为是建议并不一定会进行,但是大多数情况下还是会进行Major GC,强烈影响系建议能不使用此方法就别使用,让虚拟机自己去管理它的内存,可通过通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc()。
2).老年代空间不足,JVM会进行Major GC,如果Major GC完后空间还是不足,就会抛出java.lang.OutOfMemoryError: Java heap space异常。
3).方法区空间不足(方法区有些人又称为“永久代”),JVM会进行Major GC,如果Major GC完后空间还是不足,就会抛出java.lang.OutOfMemoryError: PermGen space异常。
4).java虚拟机中有分配担保机制,当新生代的复制空间存储不下存活对象时就会触发担保机制,会把剩下无法存储的对象直接存放进老年代,如果此时老年代空间也无法存储,就会担保失败,担保失败后JVM会进行Major GC。
5).CMS垃圾收集器进行GC的时候会产生浮动垃圾,浮动垃圾就是进行GC过程中产生的垃圾,占用了空间,没有被GC,导致空间不足,JVM虚拟机进行Major GC。
6).分配的对象太大,这种对象会直接进入老年代,老年代的剩余空间够,但是连续空间不够,此时JVM虚拟机进行Major GC。