Java技术

GC Collectors(copy)

2018-10-28  本文已影响36人  一字马胡

作者: 一字马胡

最近在学习GC相关内容,总觉得写过GC相关的文章,然后去翻了一下写过的文章集,果然发现了一篇自己都觉得不可思议的文章:浅谈JVM中的垃圾回收,这篇文章信息量较大,但是止于概念,虽然说得很多,包括JVM运行时内存布局、JVM堆的分代、GC的概念及各种GC算法的介绍,并且介绍了多个GC的运行原理,甚至还包括了JVM调优的相关内容。当然,那篇文章是在读《深入理解java虚拟机》的时候总结的,也包括从其他地方引用了一些内容,草草总结起来的一篇长文,质量算不上很高,但是也算是学习JVM/GC的第一篇文章吧。

本篇文章内容纯粹是从这里转译过来的,这篇文章介绍了多个GC,以及他们是如何搭配工作的,很有实际意义。

GCs

这张图高度概括了多种GC,以及各个GC工作在新生代还是老年代,以及GC可以怎么搭配,图中黄色区域为新生代,灰色为老年代,每一个蓝色的方块代表一种GC,两个蓝色的方块之间连线代表他们可以相互搭配,没有连线的两个GC是不能相互配合的,图中仅有一个特殊的蓝色的方块,里面的内容为问号,其实代表的是G1 GC,除了这个特殊的蓝色方块之外,其他的方块内部都描述了GC的名称,下面简要介绍每一个GC。

总结:年轻代GC都采用copying算法,而老年代则没有使用copying算法,老年代GC管理的堆空间较大,一般需要考虑内存碎片问题(因为没有采用copying算法),特别是CMS。并发GC和并行GC的区别是是否可以在GC线程工作的同时运行用户代码。下面是一些GC设置产生的GC组合情况。

设置 年轻代GC 老年代GC
-XX:+UseSerialGC Serial Serial Old
-XX:+UseParNewGC ParNew Serial Old
-XX:+UseConcMarkSweepGC ParNew CMS + Serial Old
-XX:+UseParallelGC Parallel Scavenge Serial Old
-XX:+UseParallelOldGC Parallel Scavenge Parallel Old
-XX:+UseG1GC G1 G1

整体来说,GC可以分为如下几类:

其中,Serial GC常用于client JVM,或者比如Serial Old在CMS发生“Concurrent Mode Failure”异常时作为备选的“Old GC”;server JVM不建议使用Serial GC;Parallel GC称为“吞吐量优先”GC,可以使用“-XX:MaxGCPauseMillis”和“-XX:GCTimeRatio”来让GC按照我们的预期工作;CMS GC称为“低延时GC”,G1 GC是目前最先进的GC;对于Server JVM,如果是一些后台任务,交互比较少的应用(比如批量处理任务),建议使用Parallel GC,如果是存在交互并且对响应时间敏感的话建议使用CMS GC(比如APP后台)。

上一篇下一篇

猜你喜欢

热点阅读