GC流程&JVM空间分配

前言

个人学识浅薄,关于JVM相关知识尚在学习阶段,博客内容属于个人从各渠道学习理解总结而来,定存在错误,遗漏的地方。尤其是流程图尚存在不完善之处,个人已更正几版。欢迎各位看官不吝赐教,求同存异,共同学习,共同进步,谢谢!
另重要的东西说三遍:要看流程图要看流程图要看流程图

GC执行流程图

GC执行流程图_pc

1. MinorGC触发的时机(参考流程理解,姿势更加哦)

1.1 老年代最大可用连续空间大于新生代所有对象的总和

因为有老年代在给新生代GC做兜底(空间担保机制),哪怕新生代中的对象全部存活,只要老年代中最大可用连续空间大于新生代中所有对象的总和,老年代都可以放的下,所以此时新生代可以放心的GC,即进行MinorGc,又称YoungGc.

1.2 老年代最大可用连续空间大于新生代历次晋升到老年代的平均大小

当老年代最大可用连续空间小于新生代所有对象的总和且老年代最大可用连续空间大于新生代历次晋升到老年代的平均大小时,虽有可能发生极端事件:新生代所有的对象都存活,但毕竟是极小概率事件。有大于新生代历次晋升到老年代的平均大小条件的保证大概率事件上老年代是可以放的下的,真的放不下了就会发生FullGc了.

2. 触发FullGc时机

2.1 老年代最大可用连续空间小于新生代历次晋升到老年代的平均大小

当老年代最大可用连续空间小于新生代历次晋升到老年代的平均大小时,也就意味着大概率事件老年代无法满足本次新生代的晋升所需的空间,这时候就要进行FullGc,对新生代,老年代,元空间进行垃圾回收。极端情况,经过FullGc后,老年代仍然有大量对象存活,空间仍无法满足需求,这时如果老年代没有达到(堆最大空间-Xmx)- (新生代空间-Xmn)设置的值,那么就会进行扩容。当然一般情况,我们出于避免扩容所带来的效率影响,会将堆最大空间-Xmx和堆最小空间-Xms设置成一样。但是如果老年代已达到最大值时,那么就会发生outOfMemory即OOM异常。

2.2 老年代最大可用连续空间大于新生代历次晋升到老年代的平均大小但是MinorGC后存活的对象大于老年代最大可用连续空间

当老年代最大可用连续空间大于新生代历史晋升到老年的平均大小时,也就意味着大概率事件老年代可以存放的下新生代经过MinorGc后的存活的对象。但是如果存活下来的新生代对象大于servivor区了,咋办?此时JVM又会进行检查,检查老年代最大可用连续空间是否大于这些存活下来的新生代对象,如果大于即老年代放的下,存活对象直接全部进入到老年代中。但是如果老年代放不下了,此时就会触发FullGc。

关于MinorGc以及FullGc的一些思考

当新生代Eden空间不足但老年代空间充足(大概率事件放的下新生代经过MinorGc存活的对象)的情况下,优先进行MinorGc。而当老年代空间不充足(大概率事件放不下新生代经过MinorGc存活的对象以及确定老年空间不足)的情况下,才会进行FullGc。毕竟FullGc比MinorGc更加耗时,STW时间更长(跟回收算法,垃圾回收器有关)。所以,JVM在设计回收机制时更加偏向于优先进行MinorGc,最后实在没辙了,开始放大招了(FullGc),其实也是无奈之举。故JVM优化时,要使得比较少的对象进入老年代,减少FullGc发生的次数。

3. JVM内存分配

3.1 大多数情况下,对象优先分配到Eden区

3.2 大对象直接进入老年代

3.3 存活时间久的对象进入老年代

3.4 动态对象年龄判断机制

3.5 MinorGc后存活的对象Servivor区放不下也直接进入老年代

<待续>

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVMJava虚拟机)的分代模型是一种内存管理策略,将堆内存划分为不同的代(Generation),包括年轻代(Young Generation)、老年代(Old Generation)和永久代(Permanent Generation,JDK8之后被元空间(Metaspace)取代)。下面是JVM分代模型的执行流程: 1. 初始阶段:当Java应用程序启动时,JVM会为其分配一块初始的堆内存空间。此时,年轻代和老年代都是空的。 2. 对象创建:当Java程序创建对象时,对象会被分配在年轻代的Eden区域。如果Eden区域没有足够的空间来存放新创建的对象,就会触发一次垃圾回收(Minor GC)。 3. Minor GC:在Minor GC中,垃圾回收器会扫描年轻代的Eden区域和Survivor区域,将不再被引用的对象进行回收。存活的对象会被移动到Survivor区域中的一个空闲区域。 4. 对象晋升:当一个对象经过多次Minor GC后仍然存活,它会被晋升到老年代。晋升条件可以根据不同的垃圾回收器而有所不同。 5. Major GC:当老年代空间不足时,会触发一次Major GC(也称为Full GC)。在Major GC中,垃圾回收器会扫描整个堆内存,对不再被引用的对象进行回收。 6. 永久代/元空间:永久代(JDK8之前)或元空间(JDK8及以后)用于存放类的元数据和常量池等信息。当类的元数据不再被使用时,会触发一次永久代/元空间的垃圾回收。 7. 内存分配担保:在进行垃圾回收时,如果老年代的空间不足以存放新创建的对象,JVM会进行一次内存分配担保。即使触发了垃圾回收,也能保证新创建的对象能够顺利分配到老年代。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值