温馨提示×

debian java内存不足怎么调

小樊
43
2026-10-16 15:20:47
栏目: 编程语言

在 Debian 上遇到 Java 内存不足(OutOfMemoryError / 进程被 kill),通常从 JVM 参数、系统资源、进程限制 三方面排查和调整。下面按常见场景说明。


一、先确认是不是真“内存不足”

1. 看 Java 报错

  • java.lang.OutOfMemoryError: Java heap space
    → 堆内存不够
  • java.lang.OutOfMemoryError: Metaspace
    → 元空间不够
  • java.lang.OutOfMemoryError: GC overhead limit exceeded
    → GC 太频繁
  • java.lang.OutOfMemoryError: Unable to create new native thread
    → 线程数或系统限制问题

2. 看是不是被系统杀掉

dmesg | grep -i "killed process"

或

journalctl -xe | grep -i oom

如果是 OOM Killer 杀掉 Java,说明 系统整体内存不足。


二、调整 JVM 内存参数(最常见)

1. 设置堆内存大小

java -Xms512m -Xmx2g -jar app.jar

说明:

  • -Xms:初始堆内存
  • -Xmx:最大堆内存(最重要)

⚠️ 不要超过物理内存的 70%~80%


2. 调整 Metaspace(Java 8+)

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

3. 调整栈大小(线程多时)

-Xss256k

4. 查看当前 JVM 参数

jps
jinfo <pid>

三、Debian 系统层面的调整

1. 查看内存

free -h
htop

2. 调整 SWAP(临时救急)

# 创建 2G swap
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

永久生效:

echo '/swapfile none swap sw 0 0' >> /etc/fstab

3. 修改 systemd 服务内存限制

如果是 systemd 启动的 Java 服务:

sudo systemctl edit your-java.service

添加:

[Service]
MemoryLimit=4G

然后:

sudo systemctl daemon-reload
sudo systemctl restart your-java.service

4. 提高线程 / 进程限制

ulimit -a

修改:

sudo vi /etc/security/limits.conf

例如:

* soft nofile 65535
* hard nofile 65535
* soft nproc 4096
* hard nproc 4096

四、Tomcat / Spring Boot 等常见场景

Tomcat

编辑:

/etc/default/tomcat9

或

CATALINA_OPTS="-Xms512m -Xmx2g"

Spring Boot

java -Xms1g -Xmx2g -jar app.jar

或环境变量:

JAVA_OPTS="-Xms1g -Xmx2g"

五、快速排查清单(建议顺序)

  1. free -h 看内存
  2. dmesg | grep oom 看是否被系统杀
  3. 调 -Xmx
  4. 加 swap
  5. 查 systemd / ulimit
  6. 用 jstat -gc <pid> 看 GC

如果你能贴出:

  • Java 报错内容
  • 启动方式(jar / tomcat / systemd)
  • free -h 输出

我可以给你 更精确的参数建议。

0 踩