jvm: 10种垃圾回收器

垃圾回收器是随着内存的增长而推进的,单线程的垃圾回收器,最多是100上百m的内存。因为内存打了大了, 一个线程去垃圾回收, 那要扫很久, 因此, 下一步的改进方向, 多线程。但是ps,po也是不能清理太多,

Serial: 及时几十m

Paralle:几个G

CMS:几十个G在这里插入图片描述
jdk:1.8默认是ps+po
我们jvm调优就是调的G1

1. Serial(单线程)

在这里插入图片描述
她是jdk1.0自带的, (停止整个世界
原理:工作线程在那工作, 内存满了, 需要垃圾回收了, 停止一切工作, 清理线程, 清理完了, 他们继续工作。
2. Serial Old
在这里插入图片描述

3. Parallel Scavenge (多线程)

在这里插入图片描述
4. Parallel Old
在这里插入图片描述
5. ParNew 和PS是一样的, 但是它是专门配置CMS使用。
在这里插入图片描述

6. CMS

号称没有STW, 从这个开始,兴起了并发垃圾回收,但是它的问题很多,她是承上启下的作用
7.
工作在老年代,concurrent mark sweep, 并发标记清除。
暂停时间非常短。
4个阶段:

  1. initial mark 初始标记
  2. 并发标记
  3. 重新标记
  4. 并发清理

在这里插入图片描述

  1. 初始标记只会找根节点引用, 哥仨去旁边等着, 由于只找刚开始的节点, 所以时间会非常的短

  2. 一边干活, 一边标记垃圾。(工作线程和垃圾回收一起工作), 但是会出现这个问题: 标记为垃圾后, 突然又引用它了, 花的时间比较多。相关算法:三色标记, 现在及以后的重点: 如何最快的找到误标和错标的
    在这里插入图片描述

  3. 由于前一个阶段有误标的,错标记的, 这个阶段重新标记, 这个阶段回收STW, 由于错误的数量比较少,这个阶段花的时间还是比较少

  4. 清理 , 这个过程工作线程会有垃圾, 这叫浮动垃圾, 而且会产生严重的碎片化。 当碎片化恨恨恨严重的时候, 让serial old来清理老年代。 所有cms卡起来, 要卡半天。

G1

在这里插入图片描述
逻辑分代, 物理不分代
把内存分成了一个一个的小区域, 这些小区域可以是老年代, 可以是幸存区, 而且, 如果区块内存不够, 可以把一些区块连起来
好处: 我们不需要回收一大块区域, 我们回收一些小块的区域,而且我们还可以, 比如新生代不够了, 我们把老年代转成新生代。


版权声明:本文为qq_45432665原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。