[Java]JVM回收算法和回收器
1. JVM垃圾回收算法
- 标记-清除算法
(1)过程
a) 标记出所有需要回收的对象
b) 回收标记的内存
(2)缺点
a) 容易形成内存碎片
b)效率问题,标记和回收效率都不高 - 标记-整理算法
. (1)过程
a) 标记出所有需要回收的对象
b) 不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动
(2)优点
a) 内存碎片问题解决 - 复制算法
(1)过程
a) 将内存分为两部分,每次只使用一部分
b) 需要进行内存回收的时候把活跃内存复制到另外一片没有用到的内存中,然后清除之前使用的内存片
(2)优点
a)不易造成内存碎片
(3)缺点
a) 内存使用率降低
4.分代收集算法
根据对象存活周期不同将内存划分为几块。一般划分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。
2. JVM垃圾回收器
- Serial收集器
利用复制算法的单线程收集器,是最古老的收集器,它的缺点是进行垃圾回收的时候必须暂停用户所有进行,即Stop The World。到现在为止他依然是虚拟机运行在client模式下的默认新生代收集器,与其他收集器相比,对于限定在单个CPU的运行环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾回收可以获得更高的单线程收集效率。 - ParNew收集器
是Serial收集器新生代的多线程实现 - Parallel Scanvenge收集器
使用复制算法的多线程收集器,更注重吞吐率 - Serial Old收集器
使用标记-整理算法,单线程收集器,用在CMS收集器中,在并发收集发生Concurrent Mode Failure的使用使用。 - Parallel Old收集器
使用多线程和标记-整理算法 - CMS收集器
(1)基于标记-清除算法
(2)过程
a) 初始标记
b) 并发标记
c) 重新标记
d) 并发清除
(3)缺点
a) CMS收集器对CPU资源非常敏感
CMS默认启动的回收线程数是(CPU数量+3)/4
b) CMS收集器无法处理浮动垃圾
因为CMS在并发清理阶段用户线程还在运行,这过程中新的垃圾没有清理
c) CMS是基于标记-清除算法实现的收集器,可能会有大量的空间碎片产生 - G1收集器
(1)面向服务端应用的垃圾收集器
(2)过程
a) 初始标记
b)并发标记
c) 最终标记
d)筛选回收
(3)特点
a) 并行与并发
b) 分代收集
c) 空间整合
从整理来看是基于标记-整理算法是下的收集器,从局部(两个Region之间)上来看是基于“复制”算法实现的,但无论如何这两种算法都意味着G1运作期间不会产生内存空间碎片,收集后能提供规整的可用内存。
d) 可预测的停顿
这是G1相对于CMS的一大优势,G1能简历可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾手机上的时间不得超过N毫秒,这几乎已经是实时Java(RTSJ)的垃圾收集器的特征了。