在 Debian 系统上出现 “Java 内存不足(OutOfMemoryError / 内存不足)”,通常不是“机器物理内存不够”这么简单,而是和 Java 自身内存模型、系统限制、配置参数 有关。下面按常见原因逐一说明。
Java 默认堆大小通常只有 物理内存的 1/4 左右,在服务器上很容易不够。
例如:
✅ 解决:
java -Xms2g -Xmx4g -jar app.jar
建议:
-Xms 和 -Xmx 设为一致,避免动态扩容Debian 默认可能对进程有资源限制。
ulimit -a
重点看:
max memory size (kb)(某些系统)virtual memory编辑:
/etc/security/limits.conf
例如:
username soft memlock unlimited
username hard memlock unlimited
如果你用 systemd 启动 Java,默认有内存限制!
systemctl show your-java-service | grep Memory
MemoryMax=...
在 .service 文件中加:
[Service]
MemoryLimit=4G
或:
MemoryMax=4G
然后:
systemctl daemon-reload
systemctl restart your-java-service
Debian 服务器常见错误:没开 swap
Java OOM 时,系统本可以用 swap 兜底。
free -h
swapon --show
创建 swap:
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
Java 内存不止堆:
| 区域 | 说明 |
|---|---|
| Heap | 对象 |
| Metaspace | 类信息 |
| Thread | 线程栈 |
| Direct Buffer | NIO |
OutOfMemoryError: Metaspaceunable to create new native thread-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
减少线程数,或限制:
-Xss512k
如果在 Docker / K8s 跑 Java:
✅ 解决:
-XX:+UseContainerSupport
-XX:MaxRAMPercentage=75
或使用较新 JDK(11+)
日志里可能看到:
Killed process 1234 (java)
说明:
查看:
dmesg | grep -i oom
# 1. 看 Java 参数
ps aux | grep java
# 2. 看内存
free -h
# 3. 看 swap
swapon --show
# 4. 看系统日志
dmesg | grep oom
# 5. 看 systemd 限制
systemctl show xxx | grep Memory
Debian 上 Java 内存不足,90% 是因为 JVM 参数没配 + systemd 限制 + 没 swap。
如果你愿意,可以贴:
我可以帮你精准定位。