JVM
0

对象的内存分配

2024.10.11 | cuithink | 706次围观

对象的内存分配

  • 一般情况下,新创建的对象都会被分配到Eden区,一些特殊的大对象才会被分配到Old区,这是内存担保机制

  • GC的悲观策略: 所有对象的生命周期,98%都是朝生夕死

  • 相同年龄的所有对象的大小总和大于S区其中一个区域的一半,则分代年龄大于或等于这个年龄的对象都要进入老年代(图灵讲的是所有年龄的对象综合,年龄1+年龄2+年龄3+年龄4)

  • Full GC=young GC+Old GC+MetaSpace GC

  • JDK1.8 开始MetaSpace用的是直接内存,元空间的GC能够减少内存碎片,节省压缩时间,而且能做到自行动态扩容(自己申请内存,权限较高)

什么时候会触发Full GC

  • 之前每次young GC晋升对象的平均大小大于剩下的老年代的空间(基于历史平均水平)

  • young GC以后,存活对象(目前年轻代所有的对象,包括垃圾对象)超过了老年代的剩余空间(基于下一次可能的GC)

  • MetaSpace 元空间不足

  • System.gc()

老年代空间分配担保机制:

年轻代每次minor gc之前JVM都会计算下老年代剩余可用空间,如果这个可用空间小于年轻代里现有的所有对象大小之和(包括垃圾对象),就会看一个“-XX:-HandlePromotionFailure”(jdk1.8默认就设置了)的参数是否设置了,如果有这个参数,就会看看老年代的可用内存大小,是否大于之前每一次minor gc后进入老年代的对象的平均大小

如果上一步结果是小于或者之前说的参数没有设置,那么就会触发一次Full gc,对老年代和年轻代一起回收一次垃圾,如果回收完还是没有足够空间存放新的对象就会发生"OOM"

当然,如果minor gc之后剩余存活的需要挪动到老年代的对象大小还是大于老年代可用空间,那么也会触发full gc,full gc完之后如果还是没有空间放minor gc之后的存活对象,则也会发生 OOM



粤ICP备16076548号
发表评论