基本回收算法( 二 )

基本回收算法

文章插图
 
二、垃圾回收器
 
目前的收集器主要有三种:串行收集器、并行收集器、并发收集器 。
串行收集器
 
基本回收算法

文章插图
 
使用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高 。但是,也无法使用多处理器的优势,所以此收集器适合单处理器机器 。当然,此收集器也可以用在小数据量(100M左右)情况下的多处理器机器上 。可以使用-XX:+UseSerialGC打开 。
并行收集器
 
基本回收算法

文章插图
 
对年轻代进行并行垃圾回收,因此可以减少垃圾回收时间 。一般在多线程多处理器机器上使用 。使用-XX:+UseParallelGC.打开 。并行收集器在J2SE5.0第六6更新上引入,在Java SE6.0中进行了增强--可以堆年老代进行并行收集 。如果年老代不使用并发收集的话,是使用单线程进行垃圾回收,因此会制约扩展能力 。使用-XX:+UseParallelOldGC打开 。
1. 使用-XX:ParallelGCThreads=设置并行垃圾回收的线程数 。此值可以设置与机器处理器数量相等 。
2. 此收集器可以进行如下配置:
§ 最大垃圾回收暂停:指定垃圾回收时的最长暂停时间,通过-XX:MaxGCPauseMillis=指定 。为毫秒.如果指定了此值的话,堆大小和垃圾回收相关参数会进行调整以达到指定值 。设定此值可能会减少应用的吞吐量 。
§ 吞吐量:吞吐量为垃圾回收时间与非垃圾回收时间的比值,通过-XX:GCTimeRatio=来设定,公式为1/(1+N) 。例如,-XX:GCTimeRatio=19时,表示5%的时间用于垃圾回收 。默认情况为99,即1%的时间用于垃圾回收 。
并发收集器
 
可以保证大部分工作都并发进行(应用不停止),垃圾回收只暂停很少的时间,此收集器适合对响应时间要求比较高的中、大规模应用 。使用-XX:+UseConcMarkSweepGC打开 。
 
基本回收算法

文章插图
 
1. 并 发收集器主要减少年老代的暂停时间,他在应用不停止的情况下使用独立的垃圾回收线程,跟踪可达对象 。在每个年老代垃圾回收周期中,在收集初期并发收集器会 对整个应用进行简短的暂停,在收集中还会再暂停一次 。第二次暂停会比第一次稍长,在此过程中多个线程同时进行垃圾回收工作 。
2. 并发收集器使用处理器换来短暂的停顿时间 。在一个N个处理器的系统上,并发收集部分使用K/N个可用处理器进行回收,一般情况下1<=K<=N/4 。
3. 在只有一个处理器的主机上使用并发收集器,设置为incremental mode模式也可获得较短的停顿时间 。
4. 浮动垃圾:由于在应用运行的同时进行垃圾回收,所以有些垃圾可能在垃圾回收进行完成时产生,这样就造成了“Floating Garbage”,这些垃圾需要在下次垃圾回收周期时才能回收掉 。所以,并发收集器一般需要20%的预留空间用于这些浮动垃圾 。
5. Concurrent Mode Failure:并发收集器在应用运行时进行收集,所以需要保证堆在垃圾回收的这段时间有足够的空间供程序使用,否则,垃圾回收还未完成,堆空间先满了 。这种情况下将会发生“并发模式失败”,此时整个应用将会暂停,进行垃圾回收 。
6. 启动并发收集器:因为并发收集在应用运行时进行收集,所以必须保证收集完成之前有足够的内存空间供程序使用,否则会出现“Concurrent Mode Failure” 。通过设置-XX:CMSInitiatingOccupancyFraction=指定还有多少剩余堆时开始执行并发收集
2. 小结
o 串行处理器:
--适用情况:数据量比较小(100M左右);单处理器下并且对响应时间无要求的应用 。
【基本回收算法】--缺点:只能用于小型应用
o 并行处理器:
--适用情况:“对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用 。举例:后台处理、科学计算 。
--缺点:应用响应时间可能较长
o 并发处理器:
--适用情况:“对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用 。举例:Web服务器/应用服务器、电信交换、集成开发环境 。
 
三、常见配置举例
  1. 堆大小设置
JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制 。32位系统 下,一般限制在1.5G~2G;64为操作系统对内存无限制 。我在windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m 。


推荐阅读