前言:
JDK9之前,虚拟机HotSpot的堆被划分为新生代和老年代,新生代中的对象年龄超过15,该对象就会被移入老年代,这种方式也是最常见的一种对象进入老年代的方式,但是对象进入老年代却不止这一种方式,下面总计下对象进入老年代的几种方式
1.大对象直接进入老年代,可以通过参数-XX:PretenureSizeThreshold=3145726来设置大对象的大小,注意值只能是b为单位的数值。
2.年龄超过15的对象就会进入老年代,可以通过参数XX:MaxTenuringThreshold=15来设置进入老年代大小的值(设置为15,则16进入),一般都是使用默认值。
3.通过分配担保策略直接进入老年代,这是因为年轻代采用标记-赋值算法导致的问题,标记算法必须有担保策略(因为他空闲的空间可能不够存储存货的对象),老年代就是他的担保策略。
4.如果在Survivor(这里指单个Survivor,因为总有一个Survivor是空的)空间中相同年龄的所有对象大小的总和大于等于Survivor(单个)空间值的一半,那么只要年龄大于或等于该年龄(指相同年龄对象大小总和大于等于Survivor中的年龄)的对象,就可以直接进入老年代,而无需遵守年龄条件的制约。这句话有一点绕举个例子,新生代总共是10m空间,Eden是8m,每个Survivor是1m,那么如果有两个一岁的对象大于等于是512kb,那么这两个对象和年龄大于等于这两个对象的都会直接进入老年代。