文章目录
引题
不同版本 JVM 默认使用的 垃圾回收器是不同的,可以通过一些参数进行选择,那么我们如何得知 JVM 使用的是那些垃圾回收器呢?
前言——参数信息命名上的差异
本文介绍通过 JVM 的参数信息来识别垃圾回收器,这里特别强调的是参数信息中命名和垃圾回收器的名字不是完全对应的。
垃圾回收器类型 | 参数名称 |
---|---|
Serial | def new generation |
ParNew | par new generation |
Parallel Scavenge | PSYoungGen |
Parallel Old | ParOldGen |
CMS | concurrent mark-sweep generation |
Serial Old(MSC) | tenured generation |
G1 | garbage-first heap |
ZGC | 还没尝试过。。 |
查看 垃圾回收器类型 的三个方法
方法一 PrintCommandLineFlags
仅适用于 windows 平台
直接在控制台输入下面的命令行,可以从展示信息中看到 当前机器 JVM 的垃圾回收器类型
java -XX:+PrintCommandLineFlags -version
方法二(通过GC日志和堆信息)
默认情况下,GC 日志和 Heap 信息我们是看不到的,可以通过增加 VM 参数的方式启动。这样当GC 发生时,我们就能看到关于垃圾回收器的相关信息了。
-verbose:gc -XX:+PrintGCDetails
- 主动触发垃圾回收事件
方法三(通过 jmap -heap vmid)
首先通过 jps 或者其它途径(比如 jvisualvm) 获取在运行的一个 JVM 进程id。
然后通过 下面的命令行即可看到堆的相关信息,从而可以看到垃圾回收器的种类。
jps
jmap -heap vmid
- 应用样例如下
先运行 jps,需要保持程序处于运行状态——比如写一个 死循环
C:\Users\WuJieJecket>jps
2064 Del
5828 RemoteMavenServer
6308 Launcher
2888
7688 Jps
然后运行 jmap -heap vmid
C:\Users\WuJieJecket>jmap -heap 2064
Attaching to process ID 2064, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.201-b09
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1606418432 (1532.0MB)
NewSize = 33554432 (32.0MB)
MaxNewSize = 535429120 (510.625MB)
OldSize = 67108864 (64.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 30212096 (28.8125MB)
used = 2154304 (2.05450439453125MB)
free = 28057792 (26.75799560546875MB)
7.1306009354663775% used
Eden Space:
capacity = 26869760 (25.625MB)
used = 2154304 (2.05450439453125MB)
free = 24715456 (23.57049560546875MB)
8.017578125% used
From Space:
capacity = 3342336 (3.1875MB)
used = 0 (0.0MB)
free = 3342336 (3.1875MB)
0.0% used
To Space:
capacity = 3342336 (3.1875MB)
used = 0 (0.0MB)
free = 3342336 (3.1875MB)
0.0% used
tenured generation:
capacity = 67108864 (64.0MB)
used = 0 (0.0MB)
free = 67108864 (64.0MB)
0.0% used
1753 interned Strings occupying 157280 bytes.
HotSpot JDK 版本和默认垃圾回收器
不同版本、不同模式下 JDK 默认垃圾回收器是不同的,默认情况下32位的hotspot都是client模式,可以修改我server模式;64位的的都是server模式,但是不可修改
关于 JDK server 模式 和 client 模式 可以参考 JVM的server模式和client模式
JDK版本 | 客户端模式 | 服务端模式 | 其他 |
---|---|---|---|
JDK 7 | Serial(新生代)+Serial Old(老年代) | Parallel Scavenge(新生代)+Parallel Old(老年代) | 如果使用 老年代指定CMS 则新生代默认为 ParNew |
JDK 8 | Serial(新生代)+Serial Old(老年代) | Parallel Scavenge(新生代)+Parallel Old(老年代) | 如果使用 老年代指定CMS 则新生代默认为 ParNew |
JDK 9 | 官方未公开32位,故无client,不统计 | G1 | |
JDK 10 | 官方未公开32位,故无client,不统计 | G1 | |
直到 JDK15 | 官方未公开32位,故无client,不统计 | G1 |