【JVM】垃圾收集器
目录
垃圾收集器:
收集算法是内存回收的方法论,垃圾收集器是内存回收的具体实现。
新生代、老年代的收集器如下:
新生代垃圾收集器:
Serial:
特点:
- 新生代
- 最悠久,最基本
- 单线程收集器:只会一个CPU或一条线程去完成垃圾收集工作
- 停顿问题:进行垃圾收集时,必须暂停其他所有的工作线程,知道它收集结束。
- 简单高效(对于单线程来说)
Serial/Serial Old收集器运行示意图
ParNew收集器:
特点:
- 新生代
- 多线程;
- 只有它能与CMS收集器配合工作;
ParNew/Serial Old收集器运行示意图
Parallel Scavenge收集器
特点:
- 新生代
- 并行的多线程
- 吞吐量优先: 吞吐量:运行用户代码时间/(运行用户代码时间+垃圾收集时间)
- 自适应调节策略
老年代垃圾收集器:
Serial Old收集器
特点:
- 单线程
- 标记-整理算法
Serial/Serial Old收集器运行示意图
Parallel Old收集器:
特点:
- 多线程
- 标记-整理算法
Parallel Scavenge /Parallel Old收集器运行示意图
CMS收集器(Concurrent Mark Sweep)
特点:
- 以获取最短回收停顿时间为目标的
- 标记-清除算法
- 并发收集、低停顿
- 对CPU资源敏感
- 无法处理浮动垃圾
- 会产生内存碎片
运作过程:
- 初始标记:“Stop The World”标记一下GC Roots能直接关联的对象,速度很快
- 并发标记:“Stop The World”GC Tracing的过程。耗时长,可以与用户线程并发执行
- 重新标记:修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,停顿时间比初始标记长,比并发标记时间短。
- 并发清除:耗时长,可以与用户线程并发执行
G1收集器
特点:
- 并行与并发
- 分代收集:
- 空间整合:标记-整理、复制
- 可预测的停顿
运行过程:
- 初始标记
- 并发标记
- 最终标记
- 筛选回收
垃圾收集器选择原理:
- 优先调整堆的大小让服务器自己来选择
- 如果内存小于100M,使用串行收集器
- 如果是单核,并且没有停顿时间的要求,串行或者JVM自己选择
- 如果允许停顿时间超过1秒,选择并行或者JVM自己选
- 如果响应时间最重要,并且不能超过1秒,使用并发收集器