JVM GC

算法

标记清除

原理

从 GC Roots开始扫描,对“可回收”、“不可回收”进行标记

优点

  • 算法相对简单
  • 存活对象比较多的情况下效率比较高

    缺点

  • 两遍扫描(第一遍找出有用的;第二遍找出没用的进行清理;),效率较低
  • 容易产生碎片
  • Eden Space(伊甸园)不适用

    Copy算法

    原理

    将内存分为两部分,将有用的复制到统一区域

    优点

  • 只扫描一次,效率高
  • 清理内存碎片

    缺点

  • 空间浪费
  • 移动复制对象,需要重新调整引用

    适用场景

  • 适用于存活对象较少的情况

Mark-Compact(标记压缩)

优点

  • 不会产生碎片,方便对象分配
  • 不会产生内存减半

    缺点

  • 需要扫描两遍
  • 需要移动对象,效率偏低

    实操

    获取配置

  • 获取JVM默认参数

    java -XX:+PrintCommandLineFlags -version
    java 11 默认参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    -XX:G1ConcRefinementThreads=8 
    -XX:GCDrainStackTargetSize=64
    -XX:InitialHeapSize=134217728
    -XX:MaxHeapSize=2147483648
    -XX:+PrintCommandLineFlags
    -XX:ReservedCodeCacheSize=251658240
    -XX:+SegmentedCodeCache
    -XX:+UseCompressedClassPointers
    -XX:+UseCompressedOops
    -XX:+UseG1GC
    java 8 默认参数
    1
    2
    3
    4
    5
    6
    -XX:InitialHeapSize=259107072 
    -XX:MaxHeapSize=4145713152
    -XX:+PrintCommandLineFlags
    -XX:+UseCompressedClassPointers
    -XX:+UseCompressedOops
    -XX:+UseParallelGC
Author: suce
Link: https://haoubox.cn/2021/07/08/JVM-GC/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.