四 4.4堆 --- MinorGC MajorGC FullGC对比 以及 堆空间分代思想

四 4.4堆 — MinorGC MajorGC FullGC概述 以及 堆空间分代思想

学习渠道:尚硅谷

A.MinorGC MajorGC FullGC概述

在这里插入图片描述

B.分代式GC触发条件

1.年轻代GC(Minor GC)触发机制

  • 当年轻代空间不足时,会触发ManorGC,此处的空间满主要是指Eden区满Survivor满不会引发GC,如果Survivor区满的话(放不下的话),触发的分配担保机制(针对地将对象直接存入老年代中)

    发现当我们使用Server模式下的ParallelGC收集器组合(Parallel Scavenge+Serial Old的组合)下,担保机制的实现和之前的Client模式下(SerialGC收集器组合)有所变化。在GC前还会进行一次判断,如果要分配的内存>=Eden区大小的一半,那么会直接把要分配的内存放入老年代中。否则才会进入担保机制。
    这里我们的第四个对象是4MB的时候,也就是(1024KB*4)/8192KB=0.5,刚好一半,于是就这第四个对象分配到了老年代。
    第二次,我们把第四个对象由4MB,改为3MB,此时3MB/8192KB=0.37,显然不到一半,此时发现3MB还是无法放入,那么就执行担保机制,把前三个对象转移到老生代,然后把第四个对象(3MB)放入eden区。
    总结
    内存分配是在JVM在内存分配的时候,新生代内存不足时,把新生代的存活的对象搬到老生代,然后新生代腾出来的空间用于为分配给最新的对象。这里老生代是担保人。在不同的GC机制下,也就是不同垃圾回收器组合下,担保机制也略有不同。在Serial+Serial Old的情况下,发现放不下就直接启动担保机制;在Parallel Scavenge+Serial Old的情况下,却是先要去判断一下要分配的内存是不是>=Eden区大小的一半,如果是那么直接把该对象放入老生代,否则才会启动担保机制。
    文章来自:https://blog.csdn.net/kavito/article/details/82292035

  • 经过IBM的统计得出98%的Java对象都具有朝生夕死的特性,因此Minor GC发生是比较频繁的,引入survivor区的相关内容是为了减少Major GC相关的发生[调优可以从该空间做文章]

  • Minor GC会引发STW[Stop-The-World机制:全局暂停],暂停其他用户线程,,垃圾回收线程优先级最高,待它完成后才可继续进行用户线程。

2.老年代GC触发机制

在这里插入图片描述

3.FullGC触发机制

在这里插入图片描述

C.堆空间分代思想

首先,通过IBM得到的结论以及前述的分析,我们能够理解分代是为了更好的工作,都是为了孩子—不同生命周期的对象以及减少STW的时间。
分代让GC性能得到进一步提升,如果不进行分代,每一次GC都要进行忙扫,可想而知,效率将会多低,因此,因地制宜,画地为牢才是最佳选择
在这里插入图片描述
JDK8 :永久代变为元空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值