jvm内存分配策略

对象优先在新生代分配

  就是新生的对象按照原则一般在新生代内存区给其分配空间。

大对象直接进入老年态

  大对象是指需要大量连续的内存空间的对象,比如非常长的字符串或者数组。因为出现这些对象意味着虚拟机要进行一次垃圾回收才可以安置这些对象,可以在虚拟机启动的时候设置 -XX pretenuresizethreshold 参数 来设置大于这个参数的大对象直接进入老年态。

长期存活的对象将进入老年态

  既然虚拟机采用了分带管理的策略来管理内存,那么如何判断一个对象时应该在老年态还是新生态中。虚拟机给每个对象设置了一个年龄计算器,当对象在Eden出生,并且活过了第一次垃圾回收,那么该对象将进入到Suivivor空间,年龄也会增加一,妹熬过一次就加一,当达到一个阈值时,就会被移动到老年态中,这个阈值默认是15,也可以通过参数配置和设置。

动态对象年龄判定

  为了更好的适应虚拟机的内存整理,虚拟机还有一个原则,如果在新生代的Suivivor空间的相同年龄对象所占的内存大于Suivivor一半时,将大于和等于这个年龄的对象加入到老年代。

空间分配担保

  在新生代发生垃圾回收时,虚拟机都会先检查这个老年态最大可用连续空间是否大于新生代所有对象总空间,如果成立,那么这次垃圾回收是安全的,可以直接进行垃圾回收。如果不成立,就会查看HandlePromotionFailure这个值是否设置开启的,如果开启,就会继续判断老年代最大可用连续空间是否大于历次垃圾回收晋升到老年代对象的平均大小,如果大于,则进行一次啊垃圾回收。如果小于或者这个参数设置为关闭状态,那么就要进行一次啊Full GC。
  为何如此?前面说了,新生代垃圾回收是复制算法,新生代内存分为8:1:1,每次垃圾回收就会将9份的移到剩余一份里面的,可能溢出,那么就用老年代担保,所以如此哦。一般上面的参数会默认设置为开启状态。