深入理解java虚拟机(五):hotspot垃圾收集算法实现

本文所讲的是sun hotspot虚拟机实现,主要讲解Serial,ParNew,Parallel Scavenge,Serial Old,CMS(Concurrent Marsk Sweep),Parallel  Old,G1(garbage first)垃圾收集器。

先看java堆内存结构,适用于非G1收集器外的垃圾收集器:


 

首先根据java对象的生存周期长短把java堆内存分成老年代和年轻代,新年代大小可以通过参数 -Xmn10M来控制
 然后年轻代又被分成3块,一个Eden区,两个大小相等的survivor区,Eden区和Survivor区的大小可以通过参数 -XX:SurvivorRatio=8来进行控制
在垃圾收集领域有个很有意思的语句“Stop the world”,原因是当执行垃圾回收时需要停止所有的用户线程。

1、Serial收集器

 年轻代收集器。
 采用复制算法
 顾名思义它是个单线程的收集器。Client模式下虚拟机新生代默认收集器

2、ParNew收集器

年轻代收集器。
 采用复制算法
 其实就是Serial收集器的多线程版本。
 Server模式下虚拟机新生代默认收集器。
 ParNew收集器也是使用 -XX:+UseConcMarkSwepGC选项后默认的新生代收集器,也可以使用-XX:+UseParNewGC选项来强制指定它。
 它默认开启的收集线程与CPU的数量相同,可以通过-XX:ParallelGCThreads参数来限制垃圾收集线程数。

3、Parallel Scavenge收集器

 年轻代收集器。
 采用复制算法
 并行收集器。
 关注点是达到一个可控制的吞吐量(吞吐量优先),而非其他收集器的尽可能缩短垃圾收集时用户线程的等待时间。
 所谓吞吐量就是CPU运行用户代码的时间和总耗时的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
 参数 -XX:MaxGCPauseMillis参数用于控制最大垃圾收集停顿时间。
 参数 -XX:GCTimeRatio直接设置吞吐量大小(垃圾收集时间比率,吞吐量的倒数)。

4、Serial Old收集器

老年代收集器。
 采用标记-整理算法。
 单线程,类似于Serial收集器。
 Client模式下虚拟机默认的老年代收集器

5、Parallel  Old收集器

 老年代收集器。
 采用标记-整理算法。
 多线程,类似于Parallel Scavenge收集器。
 与Parallel Scavenge收集器搭配使用。

6、CMS收集器

 老年代收集器。
 采用标记-清除算法。
 获取最短回收停顿时间为目的。
 整个过程分为4个步骤:
       初始标记
       并发标记
       重新标记
       并发清除
 其中,初始标记和重新标记这两步骤仍然需要“Stop the world”。
 默认启用的回收线程数是(CPU数量+3)/4。
 参数 -XX:CMSInitiatingOccupancyFraction的值来触发垃圾收集。

7、G1(garbage first)收集器

 当今收集器技术的发展最前沿技术。
 从jdk1.7发布。

 

附: JVM 内存布局以及垃圾收集及管理详解  http://blog.csdn.net/chaofanwei/article/details/12028831

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值