第22题:怎么查看服务器默认的垃圾回收器是哪一个
📚回答:
- 核心考点:
“默认”指未显式指定GC参数时,JVM根据JDK版本、CPU核心数、内存大小自动选择的回收器。不同版本默认值不同。
1. 不启动进程即可查(大厂必会)
方法一:java -XX:+PrintFlagsFinal -version | grep Use
java-XX:+PrintFlagsFinal-version|grep-E"Use.*GC"- 输出解读:
bool UseParallelGC = true→ JDK 8 默认(Parallel)bool UseG1GC = true→ JDK 9+ 默认(G1)
- 关键:
:=表示最终生效值,=表示未被修改但可能是默认
方法二:java -XX:+PrintCommandLineFlags -version
java-XX:+PrintCommandLineFlags-version输出示例(JDK 8):
-XX:InitialHeapSize=... -XX:+UseParallelGC -XX:+UseParallelOldGC优点:直接显示当前环境实际使用的GC。
2. 运行中进程查(生产环境常用)
方法一:jinfo -flags <PID>
jinfo-flags12345|grep-E"Use.*GC"注意:只显示非默认值。如果输出为空,说明用的是当前版本的出厂默认GC。
方法二:jstat -gc <PID>反推
jstat-gc123451s通过空间名称判断:
| 输出中出现的关键字 | 对应GC |
|---|---|
PSYoungGen、ParOldGen | Parallel(JDK 8默认) |
G1 Young Generation、G1 Old Gen | G1(JDK 9+默认) |
ParNew、CMS | CMS(已废弃) |
S0C+S1C但无PS前缀 | Serial |
3. 不同JDK版本的默认GC(面试必背)
| JDK版本 | 默认垃圾回收器 |
|---|---|
| JDK 7及以前 | Parallel GC(但Server/Client模式有别) |
| JDK 8 | Parallel GC(-XX:+UseParallelGC) |
| JDK 9 ~ JDK 14 | G1(-XX:+UseG1GC) |
| JDK 15+ | 仍是G1,但ZGC逐步成熟(需显式开启) |
- 考点:JDK 8默认不是G1,JDK 9+默认才是G1。很多人会答错。
4. 快速判断脚本(大厂面试手写级)
# 一行命令判断当前JDK默认GCjava-XX:+PrintCommandLineFlags-version2>&1|grep-oE'\-XX:\+Use[^ ]*GC'|head-15. 总结对比表
| 方法 | 是否需要进程 | 结果准确性 | 适用场景 |
|---|---|---|---|
PrintFlagsFinal | grep | 否 | 最终生效值 | 开发/测试环境 |
PrintCommandLineFlags | 否 | 直接显示 | 快速确认 |
jinfo -flags | 是 | 运行中值 | 生产环境 |
jstat -gc | 是 | 间接推断 | 无法用jinfo时 |
💡面试官想要的满分回答:
“查看默认GC分两种情况:
- 未启动时:用
java -XX:+PrintCommandLineFlags -version直接看到启动参数中自动添加的GC标志。- 已运行进程:用
jinfo -flags <PID>查看是否显式设置过GC,如果输出没有GC相关参数,说明用的是该JDK版本的出厂默认值。记住:JDK 8默认Parallel,JDK 9+默认G1。生产环境不要凭记忆,必须用命令实际验证。”
觉得对您有帮助,麻烦点点关注啦,您的关注是我创作的最大动力~ 🎯