💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 内存分配策略 * 优先分配到eden * 大对象直接分配到老年代 * 长期存活的对象分配到老年代 * 空间分配担保 * 动态对象年龄判断 * 逃逸分析和栈上分配 # 大对象直接分配到老年代 典型是大对象就是很长的字符串或者数组. 大对象对虚拟机是个坏消息,更坏的是朝生夕死的大对象. jvm提供了`-XX:PretenureSizeThreshold`参数,大于这个参数对象就直接在老年代分配.这样做的目的是避免在Eden区以及两个Survivor区之间发生大量的内存复制(新生代用的复制算法) `-XX:PretenureSizeThreshold`只针对Serial和ParNew有效 # 长期存活的对象分配到老年代 jvm给每个对象定义了一个年龄age的计数器. 在Eden出生,并且经过一次Minor GC后,并且能在Survivor放,就会移动到Survivor区域,age+1. 对象每次在Survivor区域熬过一次Minor GC,age就+1. age加到一定程度(默认15岁),就到老年代中. 年龄的阈值,通过参数`-XX:MaxTenuringThreshold`设置 在后续的java版本,并不是严格执行这个的 # 动态对象年龄判断 为了适应不同程序.jvm不是要求年龄必须达到`-XX:MaxTenuringThreshold`设置,才可以到老年代. 如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代 # 空间分配担保 在发生minor gc之前,虚拟机会检测 : 老年代最大可用的连续空间>新生代all对象总空间? 1. 满足,minor gc是安全的,可以进行minor gc 2. 不满足,虚拟机查看`-XX:+HandlePromotionFailure`参数: * 为true,允许担保失败,会继续检测老年代最大可用的连续空间>历次晋升到老年代对象的平均大小。若大于,将尝试进行一次minor gc,若失败,则重新进行一次full gc * 为false,则不允许冒险,要进行full gc(对老年代进行gc)