MinorGC、MajorGC、FullGC的异同-自我认知

最近看JVM书籍,在GC这一章节被几种常见的GC类型困扰,根据书籍上的描述和资料查找,大致作出以下归纳,如有不对,请各位看官在评论区指正。

Minor GC:

  1. 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。
  2. 每次 Minor GC 会清理年轻代的内存。
  3. 指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕死的特性,所以MinorGC非常频繁,一般回收速度也比较快。

Major GC/Full GC:
为什么放在一起说呢,因为在书籍和资料查找过程中,都没有明确的看到官方JVM规范中去指出到底什么为MajorGC和FullGC,就我自己的理解:

  1. Major GC 是清理老年代。
  2. Full GC 是清理整个堆空间—包括年轻代和老年代,为什么这样说,因为Major GC发生过程常常伴随一次Minor,因此Full GC可以看做是Major GC+Minor GC共同进行的一整个过程,清理了整个堆上的对象。(这里不包含永久代,因为永久代在JDK7之前包含方法区,是一块与堆分离的区域;JDK7将静态变量从永久代移到堆中;JDK8则完全取消永久代,方法区存在元空间MetaSpace中,虽然与堆共享一块内存,逻辑上可以认为在堆中,但仍然与堆不相连)。
  3. GC日志中同样出现过GC和Full GC两个关键字,但在日志理解中,两种GC类型不是用来区分GC发生的区域,而是区别此次GC是否发生了STW(Stop The World)。
  4. 各位看官在面试中应该关心面试官的问题是关注当前的 GC 是否停止了所有应用程序的线程,还是能够并发的处理而不用停掉应用程序的线程,即面试官问的是GC发生的区域还是GC是否出发STW。

你可能感兴趣的:(Java基础,JVM,JVM原理)