在vscode中开启gc日志需在.vscode/launch.json的vmargs中添加jdk对应参数:jdk9+用-xlog:gc*:gc.log:time,tags,level,jdk8用-xx:+printgcdetails -xx:+printgctimestamps -xloggc:gc.log,并确保使用debug而非run模式执行。

怎么加 JVM 参数开启 GC 日志输出
VSCode 本身不直接控制 Java 进程的启动参数,真正起作用的是你用的运行插件(比如 Extension Pack for Java 或 Code Runner)。关键在于让 java 命令实际执行时带上 GC 日志开关。
最稳妥的方式是修改项目根目录下的 .vscode/launch.json——如果你用的是官方 Java 插件的调试模式。在 configurations 数组里找到对应配置,往 vmArgs 字段里加参数:
"vmArgs": "-Xlog:gc*:gc.log:time,tags,level -Xmx512m"
注意:-Xlog 是 JDK 9+ 的语法;JDK 8 必须用 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log,否则日志不生成。
-
-Xlog:gc*表示启用所有 GC 相关日志;gc.log是输出路径,建议用相对路径(如./logs/gc.log),确保目录存在 - 加
time,tags,level能让每行带毫秒级时间戳和事件类型,方便后续分析 - 别漏掉
-Xmx等内存参数——GC 频率直接受堆大小影响,空跑默认堆可能根本触发不了 Full GC
为什么 launch.json 里加了参数却没生成 gc.log
常见原因是 VSCode 没真正用上这个配置:你点「运行」(Run)而不是「调试」(Debug),或者用了 Code Runner 插件,默认忽略 launch.json。
验证方法:在 launch.json 的配置中加个明显错误参数,比如 -XX:+UseInvalidGC,再 Debug——如果报错说明配置生效了;如果静默运行成功,大概率是走的别的执行路径。
- Code Runner 用户请改
settings.json,搜code-runner.executorMap,找到java对应项,在命令模板末尾拼上-Xlog:gc... - 终端手动跑
java -Xlog:gc*:gc.log ... YourClass成功,但 VSCode 不行?说明插件未继承终端环境变量或 JVM 路径,检查java.home设置是否指向你期望的 JDK - 日志文件权限被拒(尤其 macOS/Linux)?试试绝对路径或换到
/tmp/gc.log
用什么工具看 gc.log 更有效
原始日志是文本,但人眼直接扫很难判断停顿是否异常、有没有内存泄漏迹象。别打开记事本硬读。
推荐两个轻量级方案:
-
GCEasy(在线):上传
gc.log,它自动解析出吞吐量、平均 GC 时间、内存趋势图。注意别传含敏感业务数据的日志 -
GCViewer(本地 Java GUI 工具):下载 jar 包双击运行,支持 JDK 8–17 的日志格式,能标出
Pause尖峰和Allocation Failure触发点
如果日志里反复出现 Allocation Failure 后紧跟着 Full GC,且老年代使用率持续 >70%,基本可以锁定是对象过早晋升或 CMS/SerialOld 回收器没调好。
分析时最容易被忽略的细节
GC 日志不是越长越好,也不是越多越准。很多问题出在采样偏差上。
- 只测单次启动?冷启动后类加载、JIT 编译会干扰 GC 行为。至少循环运行 3–5 次,取后几次日志
- 没开
-Xlog:safepoint?某些卡顿看似 GC 导致,其实是 safepoint 等待,日志里查不到 GC 记录 - 用 G1 但没加
-Xlog:gc+ergo*=debug?G1 的 Mixed GC 触发逻辑藏在 ergonomics 日志里,光看gc级别会漏掉自适应调优失败的关键线索
真正要定位 GC 问题,日志只是入口,得结合 jstat -gc 实时观测或 jfr 录制飞行记录才能闭环。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











