JVM之垃圾回收

301 阅读4分钟

本文源自Recently祝祝,创自Recently祝祝。转载请标注出处。

此解决方式在企业中有所应用,适合Java初级开发学习,参考。

本文字数与行数,耐心阅读必有收获

image.png

1.垃圾收集算法

垃圾收集算法有三种:标记清理算法,拷贝算法、标记整理算法。
标记清理算法:分为两步,标记要回收的垃圾,然后进行统一的清理回收。内存清理之后会出现内存不连续的现象

拷贝算法:对总内存分成两块区域,一次只使用一块内存,当使用的那块内存满了的时候,进行一次GC,将存活的对象复制到另一块区域中,然后将已使用的内存清空。

标记整理算法:将所有需要清理的对象进行标记,然后统一清理,清理清理之后将存活的对象复制到一块。其余部分将被清理。

2.垃圾收集器有哪些

垃圾收集器有八种,并且他们都用于不同的分代中:

  • 新生代回收器:Serial、ParNew、Parallel Scavenge
  • 老年代回收器:Serial Old、Parallel Old、CMS
  • 整堆回收器:G1、ZGC

垃圾回收器可以组合使用: image.png

3.他们的特点是什么?

STW:挂起应用线程,暂停用户线程,暂停所有线程工作 Safe Point:在那些阶段点进行暂停线程,挂起线程

挂起线程的点有Safe Point:

  • 循环的末尾
  • 方法返回前
  • 调用方法call之后
  • 抛出异常的位置

1)ParNew 收集器

●Serial的多线程版本,但是单线程的使用ParNew的使用性能不如Serial,因为存在线程交互是开销
●新生代多线程使用ParNew垃圾回收器,老年代单线程使用Serial Old垃圾回收器
●进行垃圾回收的时候需要需要线程停止工作

2)ParallelScavenge 收集器

●parallelScavenge是并行收集器,然而在新生代的时候使用,老年代使用串行收集器
●新生代使用复制算法,老年代使用整理算法
●这是一个吞吐量优先的收集器,垃圾回收的时候需要停止所有线程

3)ParallelOld 收集器

●并行收集器,PS收集器的老年代版本
●也是一个吞吐量优先收集器,垃圾回收需要进行STW
●对cpu敏感,所以一般在CPU敏感的场所一般Parallel Scavenge和Parallel Old收集器组合使用。
●新生代使用复制算法,老年代使用标记整理算法

4)CMS 收集器

●采用并发回收的垃圾收集器,只在初识标记和重新标记阶段需要进行STW。具有低延时的特点。
●并发收集,可以同时执行多个用户线程。整个回收过程线程没有中断,所以需要在回收过程中确保有足够的内存可用
●CMS一共有四个阶段:初识标记、并发标记、重新标记、并发清理
●使用标记清除算法作为垃圾收集器算法,会产生内存碎片,可能会导致并发清除后,用户线程可用的空间不足
●CMS特点之一不会等内存被填满才会回收,达到阈值就开始回收

5)G1 收集器

●一款全功能的垃圾收集器。 并行与并发共同进行垃圾处理。
●不需要其它垃圾清理器就能够独立管理整个GC堆
●使用的是标记整理的算法实现收集器,所以不会出现内存碎片。
●可以设置垃圾收集时间,但是更短的GC会带来回收效率降低的问题
●G1垃圾收集器有四个步骤:初始标记、并发标记、最终标记、筛选回收 。除了并发标记不需要STW,其他的都需要 ●内存划分中取消了年轻代与老年代的概念,使用多个区域组成,不用考虑每个代内存如何分配

文章全为个人理解,如果发现部分跟你所知道的有出入,欢迎在评论区指出,欢迎探讨。