温馨提示×

ubuntu java内存怎么调优

小樊
39
2026-09-01 04:47:16
栏目: 编程语言

在 Ubuntu 上做 Java 内存调优,通常包含 JVM 参数配置、系统资源限制、监控与分析、常见问题处理 几个层面。下面给你一套比较系统、可落地的做法。


一、先明确:你调的是什么内存?

Java 内存主要分几块:

  • Heap(堆)-Xms / -Xmx
  • Metaspace(元空间,Java 8+)-XX:MetaspaceSize
  • Thread Stack(线程栈)-Xss
  • Direct Memory(堆外内存)-XX:MaxDirectMemorySize
  • 系统层面限制:ulimit、cgroup、swap

二、基础 JVM 内存参数(最重要)

1. 设置堆内存(最常见)

java -Xms2g -Xmx2g -jar app.jar

建议:

  • 生产环境 Xms = Xmx,避免动态扩容导致 GC 抖动
  • 容器环境不要超过物理内存 70%~80%

2. 元空间(防止 Metaspace OOM)

-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m

3. 线程栈大小

-Xss512k

线程多时(几千线程)很关键。


三、Ubuntu 系统层面的限制(很容易踩坑)

1. 查看内存

free -h
top
htop

2. 查看进程内存限制

ulimit -a

重点看:

  • max memory size
  • virtual memory
  • open files

修改示例(临时):

ulimit -v unlimited
ulimit -u 65535

永久修改:

/etc/security/limits.conf

四、Docker / 云服务器特别注意

1. 老 JDK(< 8u191)不知道容器内存

-XX:+UnlockExperimentalVMOptions
-XX:+UseCGroupMemoryLimitForHeap

2. 新 JDK(推荐)

-XX:+UseContainerSupport
-XX:MaxRAMPercentage=75.0

五、GC 与内存调优(很关键)

1. 选择 GC

  • 中小应用:G1(默认)
  • 大内存低延迟:ZGC / Shenandoah
-XX:+UseG1GC

-XX:+UseZGC

2. 打印 GC 日志(必须)

-Xlog:gc*:file=/var/log/gc.log:time,level,tags

旧版:

-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/var/log/gc.log

六、如何判断内存是否异常?

1. 看是否 OOM

grep -i "OutOfMemory" /var/log/app.log

2. 生成堆 dump

jmap -dump:live,format=b,file=heap.hprof <pid>

3. 实时看内存

jstat -gcutil <pid> 1000

4. 看线程 & 堆

jstack <pid>
jmap -heap <pid>

七、典型问题 & 解决方案

问题 1:内存占用远大于 -Xmx

原因:

  • 线程多
  • 堆外内存(Netty、ByteBuffer)
  • 元空间

解决:

  • 减线程
  • 限制 DirectMemory
  • 升级 JDK

问题 2:频繁 Full GC

原因:

  • 堆太小
  • 内存泄漏

解决:

  • 调大堆
  • dump 分析

问题 3:Ubuntu 上 Java 被 kill

看:

dmesg | grep -i oom

通常是:

  • 超过 cgroup 限制
  • swap 没开

八、推荐的生产配置示例(4G 服务器)

java \
-Xms2g -Xmx2g \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=512m \
-Xss512k \
-XX:+UseG1GC \
-Xlog:gc*:file=/var/log/gc.log:time \
-jar app.jar

如果你愿意,可以告诉我:

  • JDK 版本
  • 是否 Docker
  • 内存多大
  • 是 Web / 微服务 / 大数据 / Spring Boot

我可以直接帮你给一套 针对性参数

0