JDK 垃圾回收介绍

推荐配置

容器内

-XX:+UseContainerSupport -XX:InitialRAMPercentage=75.0 -XX:MaxRAMPercentage=75.0 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/nas/dump-${POD_IP}-$(date '+%s').hprof

G1

https://juejin.cn/post/6856222574155104270
https://juejin.cn/post/7007343142328352804
https://blog.csdn.net/jiguansheng/article/details/105406343
https://tech.meituan.com/2016/09/23/g1.html

概念

新生代

新生代又叫年轻代,大多数对象在新生代中被创建,很多对象的生命周期很短。每次新生代的垃圾回收(又称Young GC、Minor GC、YGC)后只有少量对象存活,所以使用复制算法,只需少量的复制操作成本就可以完成回收。

新生代内又分三个区:一个Eden区,两个Survivor区(S0、S1,又称From Survivor、To Survivor),大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到两个Survivor区(中的一个)。当这个Survivor区满时,此区的存活且不满足晋升到老年代条件的对象将被复制到另外一个Survivor区。对象每经历一次复制,年龄加1,达到晋升年龄阈值后,转移到老年代

老年代

在新生代中经历了N次垃圾回收后仍然存活的对象,就会被放到老年代,该区域中对象存活率高。老年代的垃圾回收通常使用“标记-整理”算法

YGC

触发条件: 新生代占据整个堆大小的 60%

新生代: Eden Space + Survivor Space

新生代晋升老年代条件

  • 对象超过 age 阈值 15
  • 附质量过程超过 50, age 最大的放到老年代

-XX:MaxGCPauseMils 默认为200ms
在优先时间内尽量回收垃圾多的区域, 让时间效率最大化

Young GC 每次都会引起全线停顿(Stop-The-World),暂停所有的应用线程,停顿时间相对老年代GC的造成的停顿,几乎可以忽略不计

Mixed GC

新生代和老年代进行收集和整理
触发条件: 老年代超过堆 45%

压缩算法回收 STW(Stop-The-World)

G1 开辟一块最多 5% 堆空间的内存用于标记压缩的数据交换, 过程产生 STW, STW 200ms内最多回收 10% 垃圾最多的区域, 回收后检查老年代是否低于 45%, 未达标继续再来一次, 最多 8 次, 8次未达标 Serial Old GC(Full GC)

Other

used = resident + swapped pages

jstat

doc

-gc

head description
S0C Current survivor space 0 capacity (KB).
S1C Current survivor space 1 capacity (KB).
S0U Survivor space 0 utilization (KB).
S1U Survivor space 1 utilization (KB).
EC Current eden space capacity (KB).
EU Eden space utilization (KB).
OC Current old space capacity (KB).
OU Old space utilization (KB).
MC Metaspace Committed Size (KB).
MU Metaspace utilization (KB).
CCSC Compressed class committed size (KB).
CCSU Compressed class space used (KB).
YGC Number of young generation garbage collection (GC) events.
YGCT Young generation garbage collection time.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.

jstat -gcutil 10

S0: Survivor 0区的空间使用率 Survivor space 0 utilization as a percentage of the space’s current capacity.

S1: Survivor 1区的空间使用率 Survivor space 1 utilization as a percentage of the space’s current capacity.

E: Eden区的空间使用率 Eden space utilization as a percentage of the space’s current capacity.

O: 老年代的空间使用率 Old space utilization as a percentage of the space’s current capacity.

M: 元数据的空间使用率 Metaspace utilization as a percentage of the space’s current capacity.

CCS: 类指针压缩空间使用率 Compressed class space utilization as a percentage.

YGC: 新生代GC次数 Number of young generation GC events.

YGCT: 新生代GC总时长(从应用程序启动到采样时年轻代中gc所用时间 单位:s)
Young generation garbage collection time.

FGC: Full GC次数 Number of full GC events.

FGCT: Full GC总时长(从应用程序启动到采样时old代(全gc)gc所用时间 单位:s)
Full garbage collection time.

GCT: 总共的GC时长 (从应用程序启动到采样时gc用的总时间 单位:s)Total garbage collection time.

查询当前使用的是什么垃圾回收器

查看是否通过 JVM 参数指定了虚拟机类型

ps -ef | grep webservice

查询 JDK 默认虚拟机类型

java -XX:+PrintCommandLineFlags -version

others

# 查看堆空间占用类, 前20条
jmap -histo PID | head -n20

bash-4.2# jmap -histo 9 | head -n20
num #instances #bytes class name (module)

1: 544456 3280814896 [C (java.base@11.0.18)
2: 3076195 1819165352 [B (java.base@11.0.18)
3: 1029042 626773184 [I (java.base@11.0.18)
4: 6287573 201202336 java.lang.ClassValue$Entry (java.base@11.0.18)
5: 4575213 183008520 java.util.WeakHashMap$Entry (java.base@11.0.18)
6: 2214270 141713280 java.util.concurrent.ConcurrentHashMap (java.base@11.0.18)
7: 1085202 130240080 [Ljava.lang.Object; (java.base@11.0.18)
8: 1492883 130059632 [Ljava.util.WeakHashMap$Entry; (java.base@11.0.18)
9: 3101147 124045880 java.lang.ref.SoftReference (java.base@11.0.18)
10: 3068059 122722360 java.lang.invoke.BoundMethodHandle$Species_LL (java.base@11.0.18)
11: 4341767 104202408 java.lang.ClassValue$Version (java.base@11.0.18)
12: 1506502 84364112 jdk.nashorn.internal.runtime.ScriptFunction (jdk.scripting.nashorn@11.0.18)
13: 2004817 80192680 java.util.TreeMap$Entry (java.base@11.0.18)
14: 2316002 74112064 java.util.HashMap$Node (java.base@11.0.18)
15: 2282867 73051744 jdk.nashorn.internal.runtime.PropertyHashMap$Element (jdk.scripting.nashorn@11.0.18)
16: 4341767 69468272 java.lang.ClassValue$Identity (java.base@11.0.18)
17: 1435938 68925024 java.util.WeakHashMap (java.base@11.0.18)
18: 1657484 66299360 jdk.nashorn.internal.runtime.CompiledFunction (jdk.scripting.nashorn@11.0.18)

[C is a char[]
[B is a byte[]
[I is a int[]
[S is a short[]
[[I is a int[][]

# 查看堆空间存活, 注意, 会触发 full gc
jmap -histo:live PID | head -n20

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 [email protected]

×

喜欢就点赞,疼爱就打赏