简述Minor GC、Major GC和Full GC之间的区别

一、定义

Minor GC:清理年轻代空间(包括 Eden 和 Survivor 区域),释放在Eden中所有不活跃的对象,释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区。Survivor区被用来作为Eden及老年代的中间交换区域,当老年代空间足够时,Survivor区的对象会被移到老年代,否则会被保留在Survivor区。

Major GC:清理老年代空间,当老年代空间不够时,JVM会在老年代进行major gc。

Full GC:清理整个堆空间,包括年轻代和老年代空间。

二、触发机制

Minor GC: 

当年轻代满时就会触发Minor GC,这里的年轻代满指的是Eden代满,Survivor满不会引发GC。 

Full GC: 

1)调用System.gc时,建议执行Full GC,不一定会执行

2)老年代空间不足 

3)方法区空间不足 

4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存 

5)由Eden区、survivor space1(From Space)区向survivor space2(To Space)区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小

三、其他

1)当 JVM 无法为一个新的对象分配空间时会触发 Minor GC,其中的内容全部会被复制,指针会从0开始跟踪空闲内存。Eden 和 Survivor 区进行了标记和复制操作。所以 Eden 和 Survivor 区不存在内存碎片,写指针总是停留在所使用内存池的顶部。 

2)执行 Minor GC 操作时,不会影响到永久代。从永久代到年轻代的引用被当成 GC roots,从年轻代到永久代的引用在标记阶段被直接忽略掉。 

3)大部分 Eden 区中的对象都能被认为是垃圾,永远也不会被复制到 Survivor 区或者老年代空间。

4)出现了 Major GC,通常会伴随至少一次的 Minor GC ,MajorGC 的速度一般会比 Minor GC 慢 10倍以上。

5)在垃圾回收过程中需要对对象引用进行更新,为了保证引用更新的正确性,Java将暂停所有其他的线程,这种情况被称为“Stop-The-World”,导致系统全局停顿。

6)垃圾收集后,若Survivor及old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域。则出现Out of memory。

发布了83 篇原创文章 · 获赞 0 · 访问量 4510

猜你喜欢

转载自blog.csdn.net/zhangdx001/article/details/105490928