常见 JVM 调优标志
堆、GC 与 JIT 选项
常见 JVM 调优标志 是 CoddyKit 上的免费 Java Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
为什么要调优 JVM
JVM 具有合理的默认设置,但对于要求较高的服务,有时需要调整堆大小、垃圾回收器和即时编译行为。
调优是最后一步:先进行性能分析,修复代码,然后仅在测量结果证明有必要时再使用标志。
堆大小:-Xms 和 -Xmx
最常见的两个标志用于设置堆的边界:
-Xms— 初始堆大小。-Xmx— 最大堆大小。
示例:java -Xms512m -Xmx2g MyApp。将 -Xms 设置为与 -Xmx 相同,可以避免长期运行的服务器发生调整大小暂停。
读取默认值
您可以询问 JVM 它选择了哪些值。Runtime 会提供当前堆的数值,而 -XX:+PrintFlagsFinal 会导出每个标志的有效值。
该示例会打印正在运行的 JVM 的内存限制。
public class Main {
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();
long mb = 1024 * 1024;
System.out.println("Max heap (Xmx): " + (rt.maxMemory() / mb) + " MB");
System.out.println("Total heap now: " + (rt.totalMemory() / mb) + " MB");
System.out.println("Free in heap: " + (rt.freeMemory() / mb) + " MB");
System.out.println("Available cores: " + rt.availableProcessors());
}
}选择收集器
现代 JDK 提供多种垃圾回收器:
-XX:+UseG1GC— 默认选项,均衡且基于分区。-XX:+UseZGC— 超低暂停时间,适合大型堆。-XX:+UseParallelGC— 最大吞吐量,但暂停时间较长。-XX:+UseSerialGC— 单线程,适合小型应用和容器。
G1 暂停目标
G1 是一种面向暂停时间的收集器。您可以为它设定目标,它会尽力达到该目标:
-XX:MaxGCPauseMillis=200要求 G1 将暂停时间控制在约 200 毫秒。
这只是一个软目标,并非保证值。将其设置得过低会迫使系统频繁进行小规模回收,并可能损害吞吐量。
使用 ZGC 实现低延迟
当暂停时间必须即使在数 GB 的堆上也保持在亚毫秒级时,请使用带有 -XX:+UseZGC 的ZGC。
它的大部分工作会与应用线程并发执行。与 G1 相比,代价是会产生一些额外的 CPU 和内存开销。它非常适合对延迟敏感的服务。
垃圾回收日志
要调优垃圾回收,必须先观察它。启用统一日志记录:
-Xlog:gc*:file=gc.log:time,uptime,level,tags
这会记录每次回收的时间戳和持续时间。请将日志导入查看器(或 JMC/JFR),在更改任何标志之前找出持续时间较长或频繁的暂停。
容器和 CPU
在容器中,JVM 会读取控制组限制。默认情况下,它会使用内存限制的一部分作为堆。
-XX:MaxRAMPercentage=75.0将堆设置为容器内存的指定百分比。-XX:ActiveProcessorCount=N覆盖检测到的 CPU 数量。
这样可以避免过量承诺内存,导致编排器随后终止进程。
即时编译与诊断标志
还有几个实用标志:
-XX:+HeapDumpOnOutOfMemoryError— 发生 OOM 时转储堆,以便进行事后分析。-XX:HeapDumpPath=/tmp— 指定转储文件的写入位置。-XX:+PrintCompilation— 查看即时编译活动。
这些标志的开销很小,但在出现问题时非常有用。
调优纪律
使用标志时应遵循以下黄金法则:
- 一次只更改一个标志,并与基线进行重新测量。
- 不要盲目照搬博客文章中的标志——它们可能针对的是旧版本 JVM。
- 大多数应用程序只需要
-Xmx,最多再选择一个垃圾收集器;默认设置已经很好。
元空间与线程
堆并不是唯一的内存区域:
-XX:MaxMetaspaceSize会限制类元数据空间的大小;如果没有这个限制,类加载泄漏可能耗尽原生内存。-Xss设置每个线程的栈大小;如果运行的线程非常多,可以调低它;如果递归层次很深,则应调高它。
这些设置很少需要调优,但了解它们的存在,有助于处理原生内存而非堆出现问题的情况。
快速检查
-Xms 和 -Xmx 标志控制什么?
回顾
值得了解的标志:
-Xms/-Xmx限制堆的大小。- 选择垃圾收集器:G1(默认)、ZGC(低暂停)或并行收集器(高吞吐量)。
- 为 G1 设置
-XX:MaxGCPauseMillis;启用-Xlog:gc*以便观察。 - 在容器中使用
MaxRAMPercentage,并使用HeapDumpOnOutOfMemoryError提高安全性。 - 一次只更改一个标志,并进行测量。
常见问题解答
「常见 JVM 调优标志」课时是免费的吗?
是的 — 「常见 JVM 调优标志」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「常见 JVM 调优标志」这节课中我会学到什么?
堆、GC 与 JIT 选项 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「常见 JVM 调优标志」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。