提起Java垃圾回收(GC)就会提到一个术语-----“全局暂停事件”(stop-the-world)。不管你选择怎样的GC算法,全局暂停事件都会发生。因为GC在执行时,除了线程GC还在执行之外,其他线程都会被中断。
GC分为新生代(young generation)和老年代(old generation)俩个部分。
新生代:大多数新创建的对象都存放在这里。很多对象在创建后很快就会变得不可达,所以很多对象都是在新生代创建,并且很快就消失了。这时候,当一个对象在这个区域消失时,我们就可以说发生了一次“小的GC”(minor GC)。
老年代:那些在新生代中存活下来的,并且没有变成不可达的对象被复制到这里。它通常要比新生代大。由于容量更大,GC发生的次数就没有新生代的频繁,所以当对象从老年代消失时,我们就说发生了一次“大GC”(major GC)或者“全GC”(full GC)。
新生代的组成:
首先,新生代分为3个区域。分别有:一个Eden区、两个存活区(Survivor)。
每个区域执行顺序大概是这样的:
1.大部分新创建的对象都处于Eden区
2.在Eden区域执行第一次GC后,存活下来的对象被移动到其中一个存活区。
3.在Eden区域再次执行GC以后,存活下来的对象继续堆积已经有的对象的那个存活区。
4.一旦一个存活区被存满,存活对象就会被移动到另一个存活区,然后被存满的那一个存活区数据就会被清掉(修改为无数据状态)。
5.如此反复一定次数之后,还处于存活状态的对象被移动到老年区。
存活区总有一个是空的,如果两个存活区域同时都有数据,或者同时为空,这意味着你的系统存在问题了。
...........
@T626code的学习笔记