Minor Gc和Full GC 有什么不同呢?

发布于 2019-11-22 11:03:11
关注者
1
被浏览
1958
1 个回答
  • 面试哥
    面试哥 2019-12-04
    为面试而生,有面试问题,就找面试哥。
    • 新生代 GC(Minor GC):指发生新生代的的垃圾收集动作,Minor GC 非常频繁,回收速度一般也比较快。
    • 老年代 GC(Major GC/Full GC):指发生在老年代的 GC,出现了 Major GC 经常会伴随至少一次的 Minor GC(并非绝对),Major GC 的速度一般会比 Minor GC 的慢 10 倍以上。

    测试:

    `java public class GCTest {

    public static void main(String[] args) {
    	byte[] allocation1, allocation2;
    	allocation1 = new byte[30900*1024];
    	//allocation2 = new byte[900*1024];
    }

    } ` 通过以下方式运行:

    添加的参数:-XX:+PrintGCDetails

    运行结果 (红色字体描述有误,应该是对应于 JDK1.7 的永久代):

    从上图我们可以看出 eden 区内存几乎已经被分配完全(即使程序什么也不做,新生代也会使用 2000 多 k 内存)。假如我们再为 allocation2 分配内存会出现什么情况呢?

    java allocation2 = new byte[900*1024];

    简单解释一下为什么会出现这种情况: 因为给 allocation2 分配内存的时候 eden 区内存几乎已经被分配完了,我们刚刚讲了当 Eden 区没有足够空间进行分配时,虚拟机将发起一次 Minor GC.GC 期间虚拟机又发现 allocation1 无法存入 Survivor 空间,所以只好通过 分配担保机制 把新生代的对象提前转移到老年代中去,老年代上的空间足够存放 allocation1,所以不会出现 Full GC。执行 Minor GC 后,后面分配的对象如果能够存在 eden 区的话,还是会在 eden 区分配内存。可以执行如下代码验证:

    `java public class GCTest {

    public static void main(String[] args) {
    	byte[] allocation1, allocation2,allocation3,allocation4,allocation5;
    	allocation1 = new byte[32000*1024];
    	allocation2 = new byte[1000*1024];
    	allocation3 = new byte[1000*1024];
    	allocation4 = new byte[1000*1024];
    	allocation5 = new byte[1000*1024];
    }

    }

    `

面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看