T626code学习笔记之浅谈Java垃圾回收(GC)

来源:互联网 发布:数据库 外部一致性 编辑:程序博客网 时间:2024/06/10 14:58

     提起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的学习笔记

原创粉丝点击