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