简述一下JAVA中JVM使用的常见垃圾收集方法和技术。
垃圾标记方法
- 引用计数
- 可达性分析
垃圾收集方法
- 标记-清除
标记对象后统一回收,存在回收效率和内存碎片的问题。 - 标记-复制
将存活对象统一移动到另一部分内存空间里去,问题是内存可用率降低。 - 标记-整理
移动存活对象向空间的某一端然后释放边界外空间,问题是计算负担较大。
垃圾收集器
- Serial :早期新生代垃圾收集器,简单高效内存消耗小但是存在停顿时间长的问题。
- ParNew :Serial收集器的多线程版本
- Parallel Scavenge : 基于标记-清除的多线程新生代收集器。相比于ParNew增加了吞吐量控制(即保证垃圾收集时间与用户代码执行时间等于某个比例)。
- Parallel Old :Parallel Scavenge的老年代版本,基于标记-整理。
- CMS :通过初始标记、并发标记、重新标记、并发清除四个步骤降低停顿时间,其中并发标记和并发清除不需要停顿用户线程,重新标记是用来修正并发标记期间多线程导致的标记对象变动。
- G1(Garabge First) : 将java堆划分成多个大小相等的Region,通过优先级列表以实现最高效回收。相比CMS,G1更接近“标记-整理”算法。
- Shenandoah :支持并发标记、并发回收、并发引用更新,具有比G1更好的性能。
- ZGC :使用染色体指针(Colored Pointer)极大降低了停顿时间,但也因此导致ZGC管理的内存不能超过4TB,但由于其出色的性能使得ZGC是未来的首选收集器之一。
我的微信链接 ,欢迎关注交流 JVM技术点速记 | 垃圾收集与内存分配