常见的垃圾回收器 *

 

 1 serial  单线程

  serial old  常见组合

2 parallel Scavenge  多线程

  parallel old  常见组合

3 parNew CMS  常见组合

 

 前面几种 不仅在逻辑上分年轻代和老年代   在物理上也是分为年轻代和老年代   内存两大块  年轻代 老年代

G1 只是在逻辑上分年轻代和老年代  登陆以后? 一块一块

Serial : 单线程 效率高   当serial 工作的时候所有工作线程都找一个安全点停止 然后清理垃圾  在清理垃圾到清理完毕之间的时间为停顿时间为(STW)   serial 只能适用于单线程  多线程垃圾太多

serial old  单线程 在老年代 用的是mark-sweep  或者是mark -compact 算法

ParallelScavenge  + Parallel Old  默认生产环境 简称PSPO   多线程清理垃圾 和上面单线程类似

只要不是明确指定CMS 或者G1 的话默认垃圾回收PSPO

ParNew+CMS     有没有不产生垃圾回收器的STW -> 没有

  ParNew 是在ParallelScavenge上增强 以便于和CMS 结合使用   CMS 在某个阶段的时候ParNew 会同时运行 

CMS  (因为之前的垃圾回收器回收垃圾的时候 其他线程无法运行) 老年代触发CMS

  concurrent mark sweep   并行回收 毛病较多  目前没有JDK版本默认是CMS

CMS 垃圾回收线程和工作线程可以同时进行   并发垃圾回收是因为无法忍受STW

 

 

 

 CMS 四个清理垃圾阶段  初始标记 单线程 重新标记多线程  这两个时间消耗较少   并发标记时间消耗占比总消耗80%

1初始标记的阶段initial Mark :在线程栈变量  静态变量  常量池  JNI指针 找到他们根对象  把他们标记出来

2并发标记阶段concurrent Mark  垃圾回收线程和并发线程同时运行  将并发垃圾标记

3重新标记 remark  由于在并发垃圾回收的过程中  并发线程会出现新的垃圾

4 清理concurrent Sweep  之间还会产生浮动垃圾  只能等下个阶段在重新清理 

posted @ 2022-04-28 13:46  花心大萝卜li  阅读(120)  评论(0)    收藏  举报