内存分配和GC触发

对象分配

  1. 优先在Eden区分配。当Eden区没有足够空间分配时, VM发起一次Minor GC, 将 Eden区和其中一块Survivor区内尚存活的对象放入另一块Survivor区域。如Minor GC时survivor空间不够,对象提前进入老年代,老年代空间不够时进行Full GC;
  2. 大对象直接进入老年代,避免在Eden区和Survivor区之间产生大量的内存复制, 此 外大对象容易导致还有不少空闲内存就提前触发GC以获取足够的连续空间.

对象晋级

  1. 年龄阈值:VM为每个对象定义了一个对象年龄(Age)计数器, 经第一次Minor GC后 仍然存活, 被移动到Survivor空间中, 并将年龄设为1. 以后对象在Survivor区中每熬 过一次Minor GC年龄就+1. 当增加到一定程度(-XX:MaxTenuringThreshold, 默认 15), 将会晋升到老年代.
  2. 提前晋升: 动态年龄判定;如果在Survivor空间中相同年龄所有对象大小的总和大 于Survivor空间的一半, 年龄大于或等于该年龄的对象就可以直接进入老年代, 而无 须等到晋升年龄.

从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC, 对老年代GC称为Major GC,而Full GC是对整个堆来说;

Minor GC触发条件:当Eden区满时,触发Minor GC。

Full GC触发条件:

  1. System.gc()
  2. 老年代空间不足
  3. 永生区空间不足
  4. 统计得到的MinorGC晋升到旧生代的平均大小大于老年代 的剩余空间
  5. 堆中分配很大的对象

猜你喜欢

转载自blog.csdn.net/clxlc/article/details/80350434