jvm随笔5-内存分配

在对象进行创建时,难免要进行内存的分配。前面提到过Eden与两个survivor内存占用比例是8:1:1,并且使用老年代作为担保。

1.对象优先在Eden分配

大多数情况下,新时代都会在Eden新生代空间中分配,因为Eden空间足够大,若Eden空间不足进行一次GC,GC时若survivor空间不足存放对象,这些对象都会被放在老年代的空间中存放。

2.大对象直接放入老年代

大对象的创建会导致Eden空间大量消耗,使得GC会提前发生,所以可以设立参数,在创建大对象达到参数规定的大小时,直接在老年代中寻找空间来分配存放

3.长期存放的对象进入老年代

创建的对象在新时代中存放时间较长以后应该进入老年代中,为了实现这个机制,虚拟机给每个对象都定义一个对象年龄计数器,在新生代中,每经历一次GC并且仍然存活在新生代中的对象让年龄计数器加一,判断方式有两种。

  • 设置参数确定一个阈值,在对象年龄到达这个阈值时将其从新生代搬入老年代中。
  • 同年龄的对象占用内存达到总内存的一半时,将大于等于这个年龄的对象都放入老年代

4.空间分配担保

因为每次GC时都可能有对象从新生代进入老年代,所以作为担保的老年代需要有足够的空间来进行担保。
一般虚拟机会检查老年代最大可用连续空间是否大于新生代所有对象的空间大小,若大于说明做足了担保,可用正常进行GC。
如果不够大小,会查看是否允许担保失败,若允许,就比较老年代最大可用连续空间是否大于历届晋升老年代对象的平均大小,若大于,可进行冒险(说是冒险,因为可能空间不够大,导致失败,必须进行Full GC)。

猜你喜欢

转载自blog.csdn.net/maniacxx/article/details/86600859
今日推荐