• 引用计数和可达性分析
    • GC Roots有哪些?

      栈帧中的局部变量表中的reference引用所引用的对象
      方法区中static静态引用的对象
      方法区中final常量引用的对象
      本地方法栈中JNI(Native方法)引用的对象Java虚拟机内部的引用, 如基本数据类型对应的Class对象, 一些常驻的异常对象(比如 NullPointExcepiton、OutOfMemoryError) 等, 还有系统类加载器。
      所有被同步锁(synchronized关键字) 持有的对象。 反映Java虚拟机内部情况的JMXBean、 JVMTI中注册的回调、 本地代码缓存等

    image.png
    image.png

    • 垃圾回收器有哪些,原理优缺点
    • finalize() 方法: 缓刑
    • 强软弱虚四种引用

      软引用用来实现缓存

    • 垃圾清除算法

      分代回收算法: 算是第四种垃圾回收算法 标记-清除算法:效率不稳定、碎片化;没人用 标记-复制算法:费空间、如果存活多效率低、老年代没法用;多用于新生代 标记-整理算法:是否移动对象都存在弊端, 移动则内存回收时会更复杂, 不移动则内存分配时会更复杂。 从垃圾收集的停顿时间来看, 不移动对象停顿时间会更短, 甚至可以不需要停顿, 但是从整个程序的吞吐量来看, 移动对象会更划算。 多用于老年代

    • GC强度分类:

      Minor GC: 新生代垃圾 Major GC: 老年代 混合收集(Mixed GC): 新生代以及部分老年代的垃圾收集。 只有G1收集器支持。 Full GC: 收集整个Java堆和方法区的垃圾收集

    • 垃圾回收器分类:

      串行回收器:串行垃圾回收是为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所有的用户线程,不适合交互性强的服务器环境 并行回收器:多个垃圾收集器线程并行工作,同样会暂停用户线程,适用于科学计算、大数据后台处理等多交互场景。 CMS回收器(Concurrent Mark Sweep(并发标记清除)): 用户线程和垃圾回收线程同时执行,不一定是并行的,可能是交替执行,可能一边垃圾回收,一边运行应用线程,不需要停顿用户线程,互联网应用程序中经常使用,适用对响应时间有要求的场景。 G1回收器:G1垃圾回收器将堆内存分割成不同的区域然后并发地对其进行垃圾回收。

    • 具体的回收器产品

    image.png

    1. JDK9默认是用G1为垃圾收集器
    2. JDK14 弃用了: Parallel Scavenge GC 、Parallel OldGC
    3. JDK14 移除了 CMS GC
    • 简单说明

      Serial GC: 新生代、单线程GC、标记-复制算法 Serial Old GC: 老年代、单线程、标记-整理算法 ParNewGC: 新生代、多线程、标记复制算法 Parallel Scavenge GC:又名吞吐量优先收集器 ;新生代、多线程、复制算法; 自适应调节策略,自动指定年轻代、Eden、Suvisor区的比例 Parallel Old GC: 老年代、多线程、标记-整理算法 CMS GC: 以获取最短回收停顿时间为目标的收集器。

      • CMS收集器对CPU资源非常敏感。
      • CMS收集器无法处理浮动垃圾(Floating Garbage)。
      • CMS收集器是基于标记-清除算法,该算法的缺点都有。

    G1 GC:G1垃圾回收器将堆内存分割成不同的区域然后并发地对其进行垃圾回收。可预测停顿时间。 缺点:耗费更多性能

    弄明白CMS和G1,就靠这一篇了
    G1回收器的优势和不足

    • GC性能指标

      吞吐量:(翻译:应用程序占比)即CPU用于运行用户代码的时间与CPU总消耗时间的比值(吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾收集时间 ))。例如:虚拟机共运行100分钟,垃圾收集器花掉1分钟,那么吞吐量就是99% 暂停时间:执行垃圾回收时,程序的工作线程被暂停的时间
      内存占用:java堆所占内存的大小
      收集频率:垃圾收集的频次