天天看点

虚拟机(四).内存分配策略

1.Minor GC和Full GC

2.对象优先放到Eden中

3.大对象放到老年代中

4.老对象放到老年代中

5.内存分配担保

1.Minor GC和Full GC

Minor GC:发生在新生代的垃圾回收。

Full GC:发生在老年代的垃圾回收。

Full GC的时间大概在Minor GC的10倍以上

2.对象优先放到Eden中

前文说过,新生代会使用复制算法,而虚拟机是采用8:1:1来配置新生代的内存空间的。8的那一份叫Eden,两个1的都叫survivor。对于Eden中的对象,进行Minor GC之后,活下来的会进入survivor中。

当new了一个对象,这个对象会被优先放到Eden中,只有经历过最少一次的Minor GC,才会进入survivor中

3.大对象放到老年代中

所谓大对象,就是那种连续占用很大内存空间的对象,这种对象会直接进入老年代

4.老对象放到老年代中

(1).什么叫老对象?由2知道,每次Minor GC后,survivor中对象都可能会发生变化。一个对象经历一次Minor GC没死,就会加一岁,当它年满15岁,就会被认为是老对象,进入老年代。

(2).上面是固定的形成老对象的方法,成为老对象还有一种方法:当survivor中某一年纪的对象占内存空间的总和大于总survivor空间的一半时,这个年纪及以上年纪的对象会被认为是老对象从而被放到老年代

5.内存分配担保

因为新生代使用的是复制算法,存活的对象是放在survivor中的,当某一次存活的对象超过survivor内存时,此时会看老年代。老年代根据情况看看要不要进行内存分配担保(可以认为是银行的贷款)

(1).当新生代的对象内存总和小于老年代的最大连续空闲内存时,这是安全的。

(2).当老年代的最大连续空闲内存时大于新生代平均晋升到老年代的大小,这是有风险的,但是还是会执行。

(3).万一哪一次,新生代晋升到老年代的大小超过了老年代最大连续空闲内存,那么就会进行一次Full GC

继续阅读