jvm-05:垃圾收集器

2019-05-16  本文已影响0人  誓俭草

垃圾收集器------收集器

收集器就是内存回收的具体实现。
java虚拟机规范没有对收集器应该如何实现有任何规定,因为不同版本、不同厂商的虚拟机提供的垃圾收集器都可能会有很大的差异。
目前讨论jdk1.7之后的hotspot虚拟机(这个版本正式提供了商用的G1收集器,之前都是实验状态)。

垃圾收集器------并行和并发

并行(Parallel):指多条垃圾收集线程并行工作,但是此时:用户线程仍然处于线程等待状态。
并发(Concurrent):指用户线程和垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个cpu上。

垃圾收集器-Serial

Serial收集器是最基础、历史最悠久的新生代的收集器。
特点:单线程、stop-the-world 、复制算法
缺点:影响用户响应时间
优点:回收时简单高效、对于限定单个cpu环境下,serial收集器由于没有线程交互的开销,专心做垃圾收集,可以获得最高的单线程收集效率。
所以:serial 收集器 对于运行在client模式下的虚拟机来说,是一个很好的选择。
SerialOld收集器是Serial的老年代收集器,采用“标记-整理”


image.png

垃圾收集器-ParNew

ParNew收集器其实是Serial的多线程版本,除了他是使用多条线程来进行垃圾回收之外和Serial是完全一样的。新生代收集器
特点:多线程、stop-the-world
缺点:单个cpu下,运行效果甚至没Serial好。
优点点:回收时简单高效、对于限定多个cpu环境下,效果比serial好,相比其它多线程收集器它可以和CMS收集器配合使用。
所以:parnew收集器是运行在server模式下的首选收集器。


image.png

垃圾收集器-Parallel Scanvenge

Parallel Scanvenge收集器是一个新生代收集器,采用复制算法。

特点:收集新生代,复制算法,多线程,高吞吐、自适应

1、与其它的收集器侧重垃圾回收时用户的停顿时间不同,它主要侧重与吞吐量,吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。

停顿时间越短就越适合需要与用户交互的程序,高吞吐量则是可以高效率地利用cpu时间尽快完成任务。

2、他有一个自适应开关(-XX:+UseAdaptiveSizePolicy):打开后,用户只需要把基本的内存数据(堆最大,初始量)设置好,然后设置更关注最大停顿时间或者更关注吞吐量,收集器会把细节参数自动调节。

Parallel Old 老年代收集器,采用标记-整理算法。


image.png

垃圾收集器-CMS

CMS(concurrent mark sweep)收集器是一个以获取最短回收停顿时间为目标的老年代收集器。

特点:并发收集、低停顿。

基于 标记-清除算法实现,但是整个过程比较复杂一些。过程分为4步:

初始标记:仅仅标记GCRoot能直接关联到的对象。速度很快,“stop the world”
并发标记:GCRoot Tracing。耗时长和用户线程同步。
重新标记:修正并发标记时,由于用户程序运行导致的标记变动。“stop the world”停顿稍长一些。
并发清除:耗时长,和用户线程同步。
缺点:吞吐量会变低、浮动垃圾无法处理、标记-清除的碎片(设置参数是 fullgc前开启碎片整理功能,gc停顿时间延长)。


image.png

垃圾收集器-G1

G1(Garbage-First)收集器是当今收集器领域最前沿成果之一。2004年sun发表第一篇G1论文,10年后才开发出G1的商用版本。

hotspot开发团队赋予它的使命:未来替调CMS收集器。

特点:

并行与并发:利用多cpu缩短stop-the-world的时间,使用并发方式解决其它收集器需要停顿的gc动作。
分代收集:新老代收集区分对待。
空间整合:G1从整理看是基于标记-整理,但是局部看是基于复制算法实现的,不会产生碎片。
可预测的停顿:能够让使用者指定在M毫秒的时间片段上,消耗在垃圾回收的时间不得超过N毫秒。
过程:初始标记、并发标记、最终标记、筛选回放。前三个和CMS一致,筛选回放是根据用户设置的停顿目标来选择回收价值最高的进行回收。


image.png

垃圾回收器比较

image.png

原文:https://blog.csdn.net/weixin_39084521/article/details/84825240

上一篇下一篇

猜你喜欢

热点阅读