0Pricing
Java Academy · 课时

常见 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 识别瓶颈
  2. Java Flight Recorder
  3. 使用 JDK Mission Control 分析
  4. 常见 JVM 调优标志
← 返回 Java Academy