温馨提示×

Ubuntu Java运行内存如何配置

小樊
31
2025-12-20 07:32:07
栏目: 编程语言

Ubuntu 下 Java 运行内存配置指南

一 常用内存参数与含义

  • 堆内存:使用 -Xms(初始堆)与 -Xmx(最大堆),如:-Xms512m -Xmx2g。建议将两者设为相同值以减少运行期扩缩堆带来的抖动。
  • 年轻代:使用 -Xmn 设置年轻代大小(如:-Xmn512m),不熟悉时保持默认更稳妥。
  • 线程栈:使用 -Xss 设置每个线程栈大小(如:-Xss1m),栈过大将限制可创建的线程数。
  • 元空间(Metaspace):JDK 8+ 使用 -XX:MetaspaceSize-XX:MaxMetaspaceSize 替代已废弃的 -XX:PermSize / -XX:MaxPermSize
  • 垃圾回收器:按需选择,如 -XX:+UseG1GC(大堆、低延迟场景常用)。
  • 说明:JVM 内存不止堆,还包括元空间、线程栈、直接内存等,容器或本地库也会占用额外内存。

二 配置方式与示例

  • 命令行直接传参(最常用、优先级最高)
    示例:java -Xms1g -Xmx2g -jar app.jar
  • 环境变量方式(便于统一维护)
    示例:export JAVA_OPTS="-Xms1g -Xmx2g";随后 java $JAVA_OPTS -jar app.jar。部分应用服务器/脚本更偏好使用专用的 CATALINA_OPTS 等变量。
  • 全局环境变量(谨慎使用)
    示例:export _JAVA_OPTIONS="-Xms512m -Xmx1g"(对所有 Java 进程生效,可能被应用或脚本覆盖)。
  • 服务/脚本场景
    • Tomcat:在 bin/catalina.sh 中设置 CATALINA_OPTS(如:-Xms1g -Xmx2g)。
    • systemd 服务:在 unit 文件的 [Service] 段加入 Environment="JAVA_OPTS=-Xms1g -Xmx2g",然后 systemctl daemon-reload && systemctl restart your.service
  • 版本提示
    • JDK 8:可用 -XX:PermSize / -XX:MaxPermSize(已废弃,仅旧版本需要)。
    • JDK 8+:使用 -XX:MetaspaceSize / -XX:MaxMetaspaceSize 控制元空间。

三 验证配置是否生效

  • 查看进程启动参数:ps -ef | grep java,确认包含 -Xms-Xmx 等参数。
  • 查询 JVM 标志值:java -XX:+PrintFlagsFinal -version | grep -E "MaxHeapSize|InitialHeapSize"(单位字节)。
  • 运行时查询(应用内):
    • Runtime.getRuntime().maxMemory() / totalMemory() / freeMemory()(单位字节)。
  • 监控 GC 与内存:jstat -gc <pid> 1000(每秒输出一次 GC 统计)。

四 常见场景配置建议

  • 通用服务:-Xms-Xmx 设为相同(如 2g),避免运行期扩缩堆;根据负载与延迟目标选择 GC(如 -XX:+UseG1GC)。
  • 高并发/低延迟:适度增大堆(如 4g 起)并配合 G1 停顿目标(如 -XX:MaxGCPauseMillis=200),同时关注线程栈与元空间。
  • 小内存环境或容器:将 -Xmx 限制在容器/物理内存的合理比例,避免与系统和其他进程争用。
  • 元空间:若出现 Metaspace OOM,增加 -XX:MaxMetaspaceSize(如 512m 或更高)并排查类加载泄漏。

五 注意事项

  • 单位可用 m/M(兆字节)与 g/G(千兆字节),如 512m2g
  • 仅设置 -Xmx 而不设 -Xms 时,JVM 会在需要时增长堆,可能造成延迟波动;建议两者等值。
  • 容器场景需同时设置容器的内存限制(如 Docker 的 -m),并确保 -Xmx 小于容器上限并预留给元空间、线程栈、直接内存等。
  • 避免把 -Xmx 设置超过物理内存或容器上限,防止 OOM Killer 终止 Java 进程。
  • 修改服务的内存参数后需重启应用或 systemd 服务以生效。

0