深入理解JVM(五)--垃圾收集器

垃圾回收器是垃圾回收算法的具体体现。要明白一点的是:直到现在为止,没有一个最好的垃圾回收器,更没有万能的垃圾回收器。只有对具体情况应用最合适的收集器。

(一):Serial收集器

Serial本意是连载的意思。顾名思义,它不是并行的,它是运行在年轻代的单线程垃圾回收器。它在进行垃圾回收时,必须停止所有其他的工作线程,直到它收集结束。这就会造成严重 的“stop-the -world”。对于Serial的这个机制带给用户的非常不好得体验,设计者们表示完全理解并说:不可能你妈妈扫地时,你也在仍纸条吧?显然。这是不符合常规的。Serial虽然在服务端有缺点。但是在Client模式下却有着其他垃圾回收器达不到的效果。由于符合Client模式的简单而高效的操作特点。停顿只是几十毫秒。是完全可以接受的。

(二):ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本。它也是运行在年轻代的垃圾回收器,它是唯一一个能在年轻代与CMS收集器配合的垃圾回收器。所以它是运行在Server模式下首选的新生代收集器。在单CPU模式下绝对不会有比Serial好的效果。但是随着CPU数量的增加,ParNew不失为一种更好的选择。

(三):Paraller Scavenge收集器

Paraller Scavenge收集器也是运行年轻代中的,它使用的是复制算法。它和ParNew收集器差不多,但是独特之处是:它关注的是可控制的吞吐量。假如JVM总共运行了100分钟,垃圾回收花掉了1分钟,吞吐量就是99%。在CMS等的收集器关注的都使尽可能的缩短垃圾回收时用户线程的停顿时间。它关注的确实是与众不同的。停顿时间越短越适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高吞吐量则可以高效率的使用cpu时间。最大的区别是Paraller Scavenge收集器可以自适应调节策略。通过设置-XX:+UserAdaptiveSizePolicy参数可以让JVM根据当前系统的运行情况收集性能监控信息,动态的调整参数信息以提供最合适的停顿时间或者最大吞吐量。

(四):Serial Old收集器

Serial Old只是Seria的老年代版本。与Serial相同。

(五):Parallel Old收集器

Parallel Old同样是Parallel老年代版本。与Parallel相同。相同的,在注重吞吐量以及CPU资源敏感的场合,可以优先考虑Parallel和Parallel Old版本的垃圾回收器。

(六):CMS收集器

**CMS(Concurrent Mark Sweep)顾名思义,CMS是基于标记–清除算法实现的。它是一种以获取最短回收停顿时间为目标的收集器。**CMS的整个回收过程分为四个步骤:

  • 初始标记(CMS initial mark)
  • 并发标记(CMS concurrent mark)
  • 重新标记(CMS remark)
  • 并发清除(CMS concurrent sweep)

从总体上说。CMS收集器的内存回收过程是与用户线程一起并发执行的。
CMS是一款优秀的垃圾收集器。具有并发收集、低停顿的优点。
但是没有完美的东西。它也有以下缺点:

  • 对cpu资源非常敏感。
  • 无法清理浮动垃圾(所谓浮动垃圾,就是由于并发清理下随着程序运行不断产生的垃圾碎片)
  • 会有大量空间碎片产生。这是由于本身的标记–清除算法导致的。

(七):G1收集器

G1垃圾回收器是至今位置最前沿的成果之一。它是面向服务端的垃圾回收器。
G1回收器有着其他回收器无法比拟的优点:

  • 并发与并行。它能充分利用多cpu多核的硬件优势来缩短stop-the-world时间。
  • 分代回收。分代概念依然得以保留。而且不需要其他收集器配合就可独立管理整个GC堆,而且还可以采用不同方式去处理新对象与旧对象的关系。以获得更好的收集效果。
  • 可预测的停顿。G1除了追求其他回收器普遍追求的降低停顿时间外,它还能建立可预测的停顿时间模型。

G1与其他收集器最大的不同之处还在于它虽然还保留着分代机制。但是年轻代与老年代不再是物理隔开了。它们都是一部分Region(不需要连续)的集合。这种化整为零的思想理解很容易。但是其中的实现细节远远要难的多。Sun实验室经过十多年时间才开发出G1的商用版本。G1收集器的运作大致可分为以下步骤:

  • 初始标记(Initial Marking)
  • 并发标记(Concurrent Marking)
  • 最终标记(Final Marking)
  • 筛选回收 (Live Data Counting and Evacuation)

目前G1发布的时间还很短。几乎还没有经过实际应用的考验。网络上关于G1收集器的性能测试报告也十分贫乏。
G1与CMS相比,虽然他们都立足于停顿时间,CMS仍是我们的选择。但是随着Oracle对G1的不断改进,G1绝对会是最终的胜利者,G1的初衷就是要能替代CMS作为一款比较更好适合server的垃圾回收器。
如果你现在采用的收集器没有出现问题,那就没有任何理由现在去选择G1,如果你追求应用的低停顿,G1可以作为现阶段一个尝试的选择。如果你追求吞吐量。那么G1不会给你带来任何好处。

你可能感兴趣的:(JVM,Java机制,深入理解JVM)