垃圾回收器是随着内存的增长而推进的,单线程
的垃圾回收器,最多是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, 从这个开始,兴起了并发垃圾回收,但是它的问题很多,她是承上启下
的作用
工作在老年代,concurrent mark sweep, 并发标记清除。
暂停时间非常短。
4个阶段:
- initial mark 初始标记
- 并发标记
- 重新标记
- 并发清理
初始标记只会找根节点引用, 哥仨去旁边等着, 由于只找刚开始的节点, 所以时间会非常的短
一边干活, 一边标记垃圾。(工作线程和垃圾回收一起工作), 但是会出现这个问题:
标记为垃圾后, 突然又引用它了
, 花的时间比较多。相关算法:三色标记
, 现在及以后的重点:如何最快的找到误标和错标的
。由于前一个阶段有误标的,错标记的, 这个阶段重新标记, 这个阶段回收STW, 由于错误的数量比较少,这个阶段花的时间还是比较少
清理 , 这个过程工作线程会有垃圾, 这叫
浮动垃圾
, 而且会产生严重的碎片化。 当碎片化恨恨恨严重的时候, 让serial old来清理老年代。 所有cms卡起来, 要卡半天。
G1
逻辑分代, 物理不分代
。
把内存分成了一个一个的小区域, 这些小区域可以是老年代, 可以是幸存区, 而且, 如果区块内存不够, 可以把一些区块连起来
好处
: 我们不需要回收一大块区域, 我们回收一些小块的区域,而且我们还可以, 比如新生代不够了, 我们把老年代转成新生代。