`
和你在一起
  • 浏览: 678194 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM调优总结(六)-分代垃圾回收详述2

阅读更多

 

分代垃圾回收流程示意

 

 

选择合适的垃圾收集算法

串行收集器

 

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

 

 

 

并行收集器

 

 

对年轻代进行并行垃圾回收,因此可以减少垃圾回收时间。一般在多线程多处理器机器上使用。使用-XX:+UseParallelGC.打开。并行收集器在J2SE5.0第六6更新上引入,在Java SE6.0中进行了增强--可以对年老代进行并行收集。如果年老代不使用并发收集的话,默认是使用单线程进行垃圾回收,因此会制约扩展能力。使用-XX:+UseParallelOldGC打开。

使用-XX:ParallelGCThreads=<N>设置并行垃圾回收的线程数。此值可以设置与机器处理器数量相等。

此收集器可以进行如下配置:

最大垃圾回收暂停:指定垃圾回收时的最长暂停时间,通过-XX:MaxGCPauseMillis=<N>指定。<N>为毫秒.如果指定了此值的话,堆大小和垃圾回收相关参数会进行调整以达到指定值。设定此值可能会减少应用的吞吐量。

吞吐量:吞吐量为垃圾回收时间与非垃圾回收时间的比值,通过-XX:GCTimeRatio=<N>来设定,公式为1/(1+N)。例如,-XX:GCTimeRatio=19时,表示5%的时间用于垃圾回收。默认情况为99,即1%的时间用于垃圾回收。

 

 

 

并发收集器

可以保证大部分工作都并发进行(应用不停止),垃圾回收只暂停很少的时间,此收集器适合对响应时间要求比较高的中、大规模应用。使用-XX:+UseConcMarkSweepGC打开。

    并发收集器主要减少年老代的暂停时间,他在应用不停止的情况下使用独立的垃圾回收线程,跟踪可达对象。在每个年老代垃圾回收周期中,在收集初期并发收集器 会对整个应用进行简短的暂停,在收集中还会再暂停一次。第二次暂停会比第一次稍长,在此过程中多个线程同时进行垃圾回收工作。

    并发收集器使用处理器换来短暂的停顿时间。在一个N个处理器的系统上,并发收集部分使用K/N个可用处理器进行回收,一般情况下1<=K<=N/4。

    在只有一个处理器的主机上使用并发收集器,设置为incremental mode模式也可获得较短的停顿时间。

 

    浮动垃圾:由于在应用运行的同时进行垃圾回收,所以有些垃圾可能在垃圾回收进行完成时产生,这样就造成了“Floating Garbage”,这些垃圾需要在下次垃圾回收周期时才能回收掉。所以,并发收集器一般需要20%的预留空间用于这些浮动垃圾。

 

    Concurrent Mode Failure:并发收集器在应用运行时进行收集,所以需要保证堆在垃圾回收的这段时间有足够的空间供程序使用,否则,垃圾回收还未完成,堆空间先满了。这种情况下将会发生“并发模式失败”,此时整个应用将会暂停,进行垃圾回收。

 

    启动并发收集器:因为并发收集在应用运行时进行收集,所以必须保证收集完成之前有足够的内存空间供程序使用,否则会出现“Concurrent Mode Failure”。通过设置-XX:CMSInitiatingOccupancyFraction=<N>指定还有多少剩余堆时开始执行并发收集

 

 

小结

串行处理器:

--适用情况:数据量比较小(100M左右);单处理器下并且对响应时间无要求的应用。
--缺点:只能用于小型应用

 

并行处理器:

--适用情况:“对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。举例:后台处理、科学计算。
--缺点:垃圾收集过程中应用响应时间可能加长

 

并发处理器:

--适用情况:“对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器、电信交换、集成开发环境。

 

18
2
分享到:
评论
12 楼 sparksun007 2019-01-05  
lseeo 写道
第五张图,复制好的在To里,为啥第六章图就全部到From里了??

From和To是相对的概念,不是固定的死名称——那个区域就叫From,那个就叫To。你可以把From理解成“活动区”,把To理解成“死亡区”,这样哪里有存储的数据哪里就是From活动区了,另一个就相对的是To“死亡区”了。
11 楼 sparksun007 2019-01-05  
284885166 写道
xj20305 写道
请问第2个图到第三个图这个过程发生了什么

标记整理


新生代不是用的复制算法吗?年老代才是用的标记整理啊?难道我记错了吗?
10 楼 284885166 2017-04-11  
xj20305 写道
请问第2个图到第三个图这个过程发生了什么

标记整理
9 楼 xj20305 2014-12-16  
请问第2个图到第三个图这个过程发生了什么
8 楼 lseeo 2013-04-07  
第五张图,复制好的在To里,为啥第六章图就全部到From里了??
7 楼 liliang_xf 2012-10-29  
楼主的图是用什么画的?
6 楼 和你在一起 2011-08-17  
一般会使用串行。但是现在的虚拟机比较智能了,如果是多个cpu可能会并行年轻代,具体可以查下。并发方式需要特别指定。
java-xp 写道
谢谢博主的文章,受益很多。
请教个问题:如果不进行配置,jvm使用什么回收方法?

5 楼 java-xp 2011-08-12  
谢谢博主的文章,受益很多。
请教个问题:如果不进行配置,jvm使用什么回收方法?
4 楼 wgh-23 2009-12-06  
楼主,你是搞什么的啊?怎么弄得这么详细?
3 楼 Aguo 2009-11-29  
陆续看完“JVM调优总结”受益良多,谢谢
2 楼 和你在一起 2009-11-26  
@zhwayne
有些东西看的英文文档,所以直接翻译过来不是很顺。在多处理器的机器上,并发收集器把其中的几个处理器拿出来,在其他处理器进行对象生成的时候,它们则进行垃圾回收,因为并行了生成和回收,整个垃圾回收时间被缩短了,所以说“使用处理器换来短暂的停顿时间”。

K/N<=1/4 意思是,在4个处理器的机器上,一般有1个处理器用于垃圾回收。

如你所说,两者的来垃圾回收过程上没有太大区别,并发收集器主要目的就是为了减少单次垃圾回收的暂停时间(有些应用场景无法忍受长时间的暂停),他相当于把这个回收过程拆成了N个小过程,每次暂停时间久短了。因此,他的效率也会比并行收集器低。



1 楼 zhwayne 2009-11-26  
早点看到图就好了,(五)中的疑问就没了
对于单核处理器,串行处理和并行处理是不是几乎一样的,甚至并行处理还要慢
对于并发收集,不是太明白,只是知道应用和回收会同时进行。

这句话‘ 并发收集器使用处理器换来短暂的停顿时间。在一个N个处理器的系统上,并发收集部分使用K/N个可用处理器进行回收,一般情况下1<=K<=N/4。’K<=4/N,那么K/N<=1/4,这是什么意思。

在每个年老代垃圾回收周期中,在收集初期并发收集器 会对整个应用进行简短的暂停,在收集中还会再暂停一次。第二次暂停会比第一次稍长,在此过程中多个线程同时进行垃圾回收工作。并发收集初期要做短暂的暂停是为了做什么?做标记吗?这么看其实和并行的实际没什么差别,只是并发收集保留了应用的线程在执行,它的效率应该比并行收集差吧。如何保证高响应时间呢?

相关推荐

Global site tag (gtag.js) - Google Analytics