说明
自动内存管理主要解决 "给对象分配内存以及回收分配给对象的内存"
目录
对象优先在Eden区分配
大对象直接进入老年代
长期存活的对象将进入老年代
动态对象年龄判定
空间分配担保
对象优先在Eden区分配
对象主要分配在新生代的Eden区,如果启动了本地线程分配缓存,将按线程优先在TLAB上分配
大对象直接进入老年代
1 大对象是指 需要大量连续内存空间的JAVA对象(例如:长字符串以及数组)
2 可通过JVM配置,使对象直接进入老年代 -XX:PretenureSizeThreshold 当大于这个设置值的对象直接在老年代分配 (单位:字节)
长期存活的对象将进入老年代
对象定义了 对象年龄(age)计数器 (当新生代每经理一次minorGC时,新生代存活的对象年龄+1)
动态对象年龄判定
1 虚拟配置中设定的maxTenuringThreshold (默认15,代表着在新生代经历15次minorGC后进入老年代)
2 当survivor空间中相同年龄所有对象大小的总和大于survivor空间的一般,年龄大于或等于该年龄(指之前相同年龄)的对象就可以直接进入老年代
空间分配担保 (GC算法章节,什么时候出发老年代full GC详细介绍了)
1 当进行新生代GC前,需要查看担保,因为可能存在晋升 老年代最大可用连续空间是否大于新生代所有对象空间
2 当不大于时,查看HandlePromotionFailure是否允许担保失败,如果不允许,就将要进行完整GC
3 允许时,再判断老年代可用连续空间是否大于历次新生代晋升到老年代对象的平均大小,如果不大于,需要进行完整GC,大于时,则允许新生代进行minor GC