垃圾回收调优参数与 JVisualVM 性能分析
设置堆大小参数、启用垃圾回收日志记录,并使用 JVisualVM 分析运行中应用的堆使用情况
垃圾回收调优参数与 JVisualVM 性能分析 是 CoddyKit 上的免费 Java Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
为什么要调优垃圾回收?
默认的垃圾回收设置适用于许多应用,但高吞吐量或低延迟工作负载可能需要调优。请先进行测量,切勿盲目调优。
堆大小标志
请设置初始堆(-Xms)和最大堆(-Xmx)。在生产环境中,请将二者设置为相同值,以避免动态调整大小造成暂停。初始值可以设为可用 RAM 的 60% 至 70%。
// Example production flags:
java -Xms2g -Xmx2g -XX:+UseG1GC MyApp
// Avoid:
java -Xmx8g MyApp // initial = 256m, max = 8g → resizing pauses新生代大小
对于内存分配密集型应用,请增大新生代,以降低 Minor GC 的频率。请使用 -Xmn 或 -XX:NewRatio(老年代与新生代的比例,默认值为 2)。
// Set Young Gen to 1 GB:
java -Xmx4g -Xmn1g MyApp
// Or via ratio:
java -Xmx4g -XX:NewRatio=3 MyApp // 3GB old, 1GB youngG1 暂停目标
设置 -XX:MaxGCPauseMillis,以告知 G1 您期望的最长暂停时间。G1 会调整其收集集合以达到该目标,但这只是目标,并非硬性保证。
java -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xmx8g MyApp
// G1 will try to keep pauses under 100 ms垃圾回收线程数
请使用 -XX:ParallelGCThreads(停止世界线程)和 -XX:ConcGCThreads(G1/ZGC 的并发线程)控制并行度。
// On an 8-core machine:
java -XX:+UseG1GC -XX:ParallelGCThreads=8 -XX:ConcGCThreads=2 MyApp启用垃圾回收日志记录(JVM 9+)
请使用 Xlog 框架记录垃圾回收事件。离线分析日志,可以发现长时间暂停、内存分配突增和对象晋升失败等问题。
java -Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=5,filesize=20m MyApp巨型对象警告
大于 G1 区域 50% 的对象称为“巨型对象”,它们会绕过新生代,直接进入老年代。这可能导致碎片化。请尽量减小大型对象,或增大区域大小。
// Increase G1 region size (range: 1 MB to 32 MB, must be power of 2):
java -XX:+UseG1GC -XX:G1HeapRegionSize=16m -Xmx16g MyAppJVisualVisualVM 概览
JVisualVM(JDK 8 自带,较新 JDK 可另行下载)提供 GUI,可监控本地和远程 JVM 进程的堆、垃圾回收、CPU 和线程。
连接到远程 JVM
请在服务器上启用 JMX,以便通过远程方式连接 JVisualVM。将这些标志添加到目标 JVM 的启动命令中。
// Remote JVM flags:
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9090 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
MyApp从 JVisualVM 获取堆转储
在 JVisualVM 中右键点击进程 →“堆转储”。转储会显示存活对象、保留大小和引用。请使用“OQL 控制台”,通过类似 SQL 的语法查询转储。
使用 JVisualVM 分析 CPU
切换到 Profiler 选项卡,然后点击“CPU”。JVisualVM 会插桩方法并显示热点调用栈。停止分析器后,可以查看哪些方法消耗的时间最多。
Java 飞行记录器与 JVisualVM
JFR 的开销较低(约 1% 至 2%),适合生产环境。使用分析功能的 JVisualVM 开销较高,更适合开发环境。生产环境请使用 JFR,开发调试请使用 JVisualVM。
快速检查
哪个标志可以设置 G1 的目标最大垃圾回收暂停时间?
回顾
在生产环境中设置 -Xms == -Xmx。使用 -XX:MaxGCPauseMillis 调优 G1。使用 Xlog 启用垃圾回收日志记录。使用 JVisualVM 进行开发调试,使用 JFR 进行生产环境分析。
常见问题解答
「垃圾回收调优参数与 JVisualVM 性能分析」课时是免费的吗?
是的 — 「垃圾回收调优参数与 JVisualVM 性能分析」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「垃圾回收调优参数与 JVisualVM 性能分析」这节课中我会学到什么?
设置堆大小参数、启用垃圾回收日志记录,并使用 JVisualVM 分析运行中应用的堆使用情况 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「垃圾回收调优参数与 JVisualVM 性能分析」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- JVM 堆区域与对象生命周期
- 垃圾回收算法:Serial、G1、ZGC、Shenandoah
- 检测和修复内存泄漏
- 垃圾回收调优参数与 JVisualVM 性能分析