深入理解java虚拟机的问题?

问题

什么时候会触发jvm分配担保?

假设eden 8mb,survivor1 1mb,survivor2 1mb,老年代10mb

对象优先在Eden区生成,当Eden+Survivor1区已经不够分配新申请的对象空间,就会触发这里面新生代(Eden+Survivor区)的Minor GC,大部分情况下,98%会死,复制到另一块Survivor2是完全够的,那么就会选择新生代里面存活的对象复制到survivor区域中去,并清空新生代,周而复始,似乎没有问题。

但此时我有一个疑问,此时有一个3mb的对象申请分配内存,假如minor gc后发生有2mb的对象存活,这时候survivor2区域已经不够放了,这时候是直接触发分配担保,把这个2mb的对象全部转移到老年代中,还是说在survivor区域中放入1mb,另外1mb放在eden区域呢?我们这里发现上面的两种假设好像都可以满足新对象申请分配内存的要求?


其实这个问题说到底是想问,到底什么时候会触发分配担保,到底是minor gc后survivor区域不够放存活的对象呢,还是说minor gc后有大量存活的对象(假设百分之90存活),导致不够分配内存给新的对象???还是说两种都会触发分配担保?感觉书上没有说清楚!

#vivo##秋招##Java#
全部评论
你们不觉得这个问题很有探讨的必要吗
点赞 回复 分享
发布于 2019-05-18 21:53
分配担保是发生在 Minor GC 之前的吧? 要进行Minor GC了,如果老年代最大可用的连续空间小于新生代所有对象空间,则是不安全的。(安全直接Minor GC) 不安全的情况下,看是否允许担保失败。 1.不允许; 2.允许但是不满足老年代最大可用的连续空间大于历次晋升到老年代对象的平均大小; 3.允许且老年代最大可用的连续空间大于历次晋升到老年代对象的平均大小。 1和2情况进行FullGC,3尝试着进行一次 Minor GC。 (这个回答不负责任
点赞 回复 分享
发布于 2019-05-18 21:54
此时会判断大于其中的一块,然后产生full Gc,如果没问题就会到老年代 但是具体细节应该是会先复制到from中,在到to中,此时如果发现大于From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
点赞 回复 分享
发布于 2019-05-18 22:42

相关推荐

10-25 00:32
香梨想要offer:感觉考研以后好好学 后面能乱杀,目前这简历有点难
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务