深入理解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

相关推荐

最近和朋友聊天,她说了句让我震惊的话:"我发现我连周末点外卖都开始'最优解'了,一定要赶在高峰期前下单,不然就觉得自己亏了。"这不就是典型的"班味入侵"吗?工作思维已经渗透到生活的方方面面。
小型域名服务器:啊?我一直都这样啊?我还以为是我爱贪小便宜呢?每次去实验室都得接一杯免费的开水回去,出门都得规划一下最短路径,在宿舍就吃南边的食堂,在实验室就吃北边的食堂,快递只有顺路的时候才取。
点赞 评论 收藏
分享
无敌虾孝子:喜欢爸爸还是喜欢妈妈
点赞 评论 收藏
分享
我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务