JVM基础GC(垃圾回收机制)

Posted 烟锁迷城

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM基础GC(垃圾回收机制)相关的知识,希望对你有一定的参考价值。

1、判断垃圾的标准

  1. 引用计数:可以通过判断一个对象被引用的次数来决定这个对象是否可以被回收,但这种判断具有缺点,如果一个对象和另一个对象互相引用,即循环引用,这就导致这个对象永远不可能被回收。
  2. 可达性分析:由GC Root开始寻找某个对象是否可达,即无论是间接引用还是直接引用,都可以到达某个对象,证明这个对象仍在使用。这对于GC Root提出了较高要求,适合成为GC Root的对象有:类加载器,Thread,本地变量表,static成员,常用引用,本地方法栈中的变量。

2、垃圾回收算法

  1. 标记清除:标记清除算法将遍历整个内存空间,并将未使用的空间,存活的对象和需要清除的垃圾分别标记出来,然后清除。这种算法会造成磁盘碎片的问题
  2. 复制:在标记清除算法的基础上,将空间划分为相等两块,其中一块为空,另一块进行使用,执行算法时,将幸存对象连续存储到备用空间上,清除原空间备用。
  3. 标记整理:在标记清除算法的基础上,将幸存对象进行整理,存储到连续的空间上,避免磁盘碎片问题。

3、分代收集算法

JVM虚拟机的不同代,采用了不同的算法。

  1. Young区采用复制算法
  2. Old区采用标记清除或标记整理

4、垃圾收集器

Serial,ParNew,Parallel Scavenger是新生代垃圾收集器,CMS(ConcMarkSweep),Serial Old,Parallel Old是老年代垃圾收集器,G1是新生代和老年代垃圾收集器。

  • Serial:新生代收集器,使用复制算法,单线程,当它开始收集,就会暂停应用程序线程,JDK1.3之前使用
  • Serial Old:老年代收集器,使用标记整理算法,同Serial。
  • ParNew:新生代收集器,使用复制算法,多线程,当它开始收集,就会暂停应用程序线程。
  • CMS:老年代收集器,使用标记整理算法,分为四个阶段,第一个阶段是单线程进行初始标记,会暂停应用程序,速度非常快。第二阶段是并发标记,避免标记不完全,进行进一步追踪。第三个阶段是单线程重新标记,会暂停应用程序。第四阶段是并发清理,清理数据。更加关注停顿时间。
  • Parallel Scavenger:类似ParNew,更关注吞吐量
  • Parallel Old:老年代收集器。使用标记整理算法,同Parallel Scavenger
  • G1:分为四个阶段,初始标记,并发标记,最终标记,筛选回收。用户可以设置一个预期的停顿时间,在筛选回收时,可以根据用户设置的停顿时间,有选择地回收,更加关注停顿时间。

5、垃圾收集器的分类使用

  • 串行收集器:Serial和Serial Old,只能有一个垃圾回收线程执行,用户线程暂停,适用于内存比较小的嵌入式设备
  • 并行收集器(吞吐量优先):Parallel Scavenger和Parallel Old,多条垃圾收集线程工作,但此时用户线程仍然处于等待状态,适用于科学计算,后台处理等交互场景。
  • 并发收集器(停顿时间优先):CMS和G1,用户线程和垃圾收集器线程同时执行,可能不是并行而是交替执行,垃圾收集器线程在执行的时候不会停顿用户线程的运行,适用于对相对时间有要求的场景,比如web服务。

6、垃圾收集器评判标准

  • 停顿时间:垃圾收集器进行垃圾回收终端应用执行响应时间
  • 吞吐量:运行用户代码时间/(运行用户代码时间+垃圾收集时间)

整两个指标是垃圾收集器好坏的评判标准,也是调优的观察目标

7、选择垃圾收集器的标准

  • 优先调整堆的大小让服务器自己来选择
  • 如果内存小于100M,使用串行收集器
  • 如果是单核,并且没有停顿时间要求,使用串行或让JVM自行选择
  • 如果停顿时间允许超过1秒,选择并行或让JVM自行选择
  • 如果响应时间最重要,使用并发收集器。.

开启对应垃圾收集器的语法为

-XX:+Use+垃圾收集器+GC

-XX:+UseSerialGC
-XX:+UseG1GC

以上是关于JVM基础GC(垃圾回收机制)的主要内容,如果未能解决你的问题,请参考以下文章

「JVM基础」——垃圾回收基础(GC相关)

GC垃圾回收机制

GC垃圾回收机制

JVM :垃圾回收机制(GC)

JVM的垃圾回收机制详解和调优

Java垃圾回收机制是啥?