昨天遇到一个问题,被问到major gc以及full gc有什么区别,发现自己对这个知识一时竟然很模糊,之前看了深入理解jvm虚拟机这本书,里面关于这方面的介绍比较少,看虚拟机实战这本书发现也是,概括的很笼统。所以我之前博客上也没有这方面的记录。所以今天打算去学习下这方面的内容。
就记录下关于Minor GC、Major GC和Full GC之间的区别
Minor GC
主要是从java堆中的年轻代(包括 Eden 和 Survivor 区域)回收内存的gc就被称为 Minor GC。
发生的场景:
当 JVM 无法为一个新的对象分配空间时会触发 Minor GC,比如当 Eden 区满了。所以分配率越高,越频繁执行 Minor GC。
执行 Minor GC 操作时,只会gc年轻代的内存空间。但是可能会导致full gc的发生,这里先不说。所有的minor gc都会导致"Stop the world"现象,这个现象就是说gc线程在启动是,其他的所有jvm线程都会暂停。对于我们来说,就是
会产生卡顿,但是一般来说,他执行时是很快的,因为新生代的空间一般很小,同时新生代空间中没用的对象,不会复制到老年代中了。
Major GC
前面我们说Minor GC会清理新生代的空间,对于的Major GC就是清理老年代的空间了。
Major GC 是清理永久代。
Full GC
Full GC 是清理整个堆空间—包括年轻代和老久代。
GC触发条件:Eden区满了触发Minor GC,这时会把Eden区存活的对象复制到Survivor区,当对象在Survivor区熬过一定次数的Minor GC之后,就会晋升到老年代(当然并不是所有的对象都是这样晋升的到老年代的),当老年代满了,就会报OutofMemory异常。
待续补充。。。