【大白话说Java面试题 第62题】【JVM篇】第22题:怎么查看服务器默认的垃圾回收器是哪一个?

第22题:怎么查看服务器默认的垃圾回收器是哪一个

📚 回答:

  • 核心考点
    "默认"指未显式指定GC参数时 ,JVM根据JDK版本、CPU核心数、内存大小自动选择的回收器。不同版本默认值不同。

1. 不启动进程即可查(大厂必会)

方法一:java -XX:+PrintFlagsFinal -version | grep Use

bash 复制代码
java -XX:+PrintFlagsFinal -version | grep -E "Use.*GC"
  • 输出解读
    • bool UseParallelGC = true → JDK 8 默认(Parallel)
    • bool UseG1GC = true → JDK 9+ 默认(G1)
  • 关键:= 表示最终生效值,= 表示未被修改但可能是默认

方法二:java -XX:+PrintCommandLineFlags -version

bash 复制代码
java -XX:+PrintCommandLineFlags -version

输出示例(JDK 8):

复制代码
-XX:InitialHeapSize=... -XX:+UseParallelGC -XX:+UseParallelOldGC

优点:直接显示当前环境实际使用的GC。


2. 运行中进程查(生产环境常用)

方法一:jinfo -flags <PID>

bash 复制代码
jinfo -flags 12345 | grep -E "Use.*GC"

注意 :只显示非默认值 。如果输出为空,说明用的是当前版本的出厂默认GC

方法二:jstat -gc <PID> 反推

bash 复制代码
jstat -gc 12345 1s

通过空间名称判断:

输出中出现的关键字 对应GC
PSYoungGenParOldGen Parallel(JDK 8默认)
G1 Young GenerationG1 Old Gen G1(JDK 9+默认)
ParNewCMS 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. 快速判断脚本(大厂面试手写级)
bash 复制代码
# 一行命令判断当前JDK默认GC
java -XX:+PrintCommandLineFlags -version 2>&1 | grep -oE '\-XX:\+Use[^ ]*GC' | head -1

5. 总结对比表
方法 是否需要进程 结果准确性 适用场景
`PrintFlagsFinal grep` 最终生效值
PrintCommandLineFlags 直接显示 快速确认
jinfo -flags 运行中值 生产环境
jstat -gc 间接推断 无法用jinfo时

💡 面试官想要的满分回答

"查看默认GC分两种情况:

  1. 未启动时 :用 java -XX:+PrintCommandLineFlags -version 直接看到启动参数中自动添加的GC标志。
  2. 已运行进程 :用 jinfo -flags <PID> 查看是否显式设置过GC,如果输出没有GC相关参数,说明用的是该JDK版本的出厂默认值。

记住:JDK 8默认Parallel,JDK 9+默认G1。生产环境不要凭记忆,必须用命令实际验证。"


觉得对您有帮助,麻烦 点点关注啦 ,您的关注是我创作的最大动力~ 🎯

相关推荐
·薯条大王1 天前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
kyriewen1 天前
面试官问"这段逻辑为什么这样写"——我才发现,这半年我写的代码,我自己都解释不了
前端·javascript·面试
ZJH__GO1 天前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
小小、码农1 天前
Linux进程控制:从fork到exec,手写一个简易Shell
linux·运维·服务器
程序员黑豆1 天前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光1 天前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林1 天前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
不会就选b1 天前
Linux之进程间通信(二)---模拟进程池
linux·运维·服务器
marvelyu1 天前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
NeilYuen1 天前
用UDP实现向DNS服务器请求IP地址
服务器·tcp/ip·udp