理解 Java GC(二)

Young Generation 的组织结构:

    为了理解GC,让我们先来看下对象第一次被创建的地方--Young Generation。Young Generation被划分为3块区域:
  • 一块 Eden 区;
  • 两块 Survior 区。

    如上所述,一共3个区域,其中Survior区有2个。每个区执行的顺序如下:

    1. 大部分新建的对象都位于Eden区;
    2. 经过一次GC后,Eden区仍然存活的对象会被丢到Survior区中的任意一个;
    3. 一旦一个Survior区满后,GC清理时会将仍然存活的对象放置到另一个Survior区。此时,之前放满对象的Survior 也将被GC清理。
    4. 经过以上步骤,并重复多次后仍然存活的对象会被丢到”old generation“。

正如大家所见,在执行上述步骤是,总有一个Survior区要保证是空的。如果两个Survior区都满了,就会被警告你的 系统出现故障了。
数据从Young Generation丢到old generation是由minor GC执行的,这也可以通过下面图示来说明:

 Before & After a GC.

注意点:在 HotSpot VM中,应用两项技术来加速内存分配。一个是bump-the-pointer,另一个是TLABs (Thread-Local Allocation Buffers)。
Bump-the-pointer是依靠记录 在Eden区最后一个分配对象的指针来实现的。这个对象位于Eden区的末端。当一个对象被 创建时,会检查Eden区可分配空间的大小。如果合适的话,该对象被创建。所以,当创建新对象时,只有在Eden区最新创建的对象会被检查,这样 就可以加速内存的分配。然而,在多线程环境中,这便行不通了。为了保证在多线程环境中,Eden区的对象线程安全,锁机制是不可避免的,这样性能就会因锁竞争而降低。TLABs”正是HotSpot VM中解决这个问题的关键。在“TLABs”中,每个线程有自己在Eden区的一小块区域,以此来保证线程安全。因为每个线程只能访问他们自己的TLAB,这样便不会出现bump-the-pointe在分配内存时发生锁等待。

以上是GC在young generation的执行过程。你没有必要记住上面提到的两种实现技术。不知道这些,对于你不会有太大影响。但是有一点你要知道:当对象在Eden区第一次创建后,执行GC多次后依然存活的对象会从Survior区被丢到”old generation“。

GC在Old Generation的执行

     当Old Generation上没有内存可以分配时,便会执行GC。执行过程因GC类型不同而不同。所以,我们先来看看GC都有哪些类型。
     根据JDK7,共有5中GC类型:
     1)Serial GC
     2)Parallel GC
     3)Parallel Old GC (Parallel Compacting GC)
     4)Concurrent Mark & Sweep GC  (or "CMS")
     5)Garbage First (G1) GC

     上述类型中,服务器上是禁止用Serial GC的。这种类型应当是在PC中单核CPU采用的。用这种类型GC,应用系统的性能明显受损。

好了,每种GC类型的讲解将在下一篇文章中继续。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值