关于jvm:CMS前世今生

23次阅读

共计 1136 个字符,预计需要花费 3 分钟才能阅读完成。

CMS 始终是面试中的常考点,明天咱们用通俗易懂的语言简略介绍下。

垃圾回收器为什么要分辨别代?


如上图:JVM 虚拟机将堆内存区域分代了,学生代是朝生夕死的区域,老年代是老不死的区域,不同的年代对象有不同个性,因而须要不同的垃圾收集器去解决。如下图,黑竖线右边的区域都是分代垃圾收集器,G1 之后内存就不分代了。

单线程垃圾收集器:Serial + Serial Old


Serial(SY),Serial Old(SO)是单线程垃圾收集器组合,垃圾收集线程是单线程的,随着古代内存区域越来越大,SY+SO 组合曾经越来越少了。垃圾收集的单线程须要 STW 工夫无疑越长。这种组合比拟适合较早 JDK 版本。如下图,用户线程示意应用程序处理过程,垃圾收集线程示意垃圾线程清理垃圾过程,此阶段应用程序是须要期待垃圾线程 STW 的。

多线程垃圾收集器:PS+PO


后面咱们说了,单线程垃圾收集器毛病就是当内存区域变大,收集效率会很低,那 OK,摇身一变,如下图,多线程垃圾处理器。

值得注意的是:PS+PO 组合是 JDK1.7,JDK1.8 默认垃圾收集器。通过 java -XX:+PrintCommandLineFlags 命令能够在 Dos 界面查看。如下图,该命令能够查看 JVM 初始化的默认参数。比方:-XX:InitialHeapSize示意初始化堆大小。

为啥蹦出来个 CMS+ParNew


并行处理有了,CMS+ParNew 又是干嘛的?其实 PO 关注是吞吐量,而 CMS 关注是缩短 STW 工夫。而 CMS 解决流程更简单,至于 ParNew,其实约等于 PS,如果你留神最下面一个图,你会发现 PS 年老代无奈和 CMS 组合。所以就多进去了一个 ParNew。

介绍 CMS 阶段


CMS,全名称 Concurrent Mark Sweep,中文释义 并发标记革除,从名字上能够看出算法思维应用标记革除算法,上面咱们看看 CMS 简化解决流程。

  • 初始标记。只标记 GC root 可达的第一个节点。会短暂的 STW。
  • 并发标记。用户线程和垃圾线程同时进行。垃圾线程会持续向下寻找 GCroot,不会有 STW。但也会有两个问题。
  • 多标:之前不是垃圾,当初线程出栈援用断开了变成了垃圾。也称为浮动垃圾。
  • 错标:之前曾经被标注是垃圾,但当初从新援用。
  • 从新标记。STW 工夫个别低于 200 毫秒。
  • 并发革除。并发革除时,因为用户线程和垃圾线程一起工作,如果 CMS 线程异样,可能会触发 SO 单线程执行。程序可能会特地迟缓。

劣势:碎片重大。

总结


次要简略介绍了分代垃圾回收器,特地介绍了 cms 执行过程,G1 留下次再说吧。好了,文章有中央还写的不清晰心愿亲们加以斧正和点评,喜爱的请点赞加关注哦。点关注,不迷路,我是叫练,边叫边练,公众号 叫练】,微信号【jiaolian123abc】。祝大家生存欢快。

正文完
 0