在 Debian 系统上优化 Java(通常指 OpenJDK / Oracle JDK)可以从 系统层面、JVM 层面、应用层面 三个方向入手。下面给你一套比较实用、可落地的优化方案。
# 查看可用版本
apt list openjdk-* -a
# 推荐 LTS 版本
sudo apt install openjdk-17-jdk
✅ 生产环境建议:
编辑:
sudo vim /etc/security/limits.conf
添加:
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
立即生效:
ulimit -n 65536
Java 对 GC 极其敏感,Swap 会导致 GC 停顿暴增。
sudo swapoff -a
永久禁用(删除或注释 /etc/fstab 中 swap 行)。
编辑:
sudo vim /etc/sysctl.conf
常用优化:
vm.swappiness = 1
vm.max_map_count = 262144
net.core.somaxconn = 65535
net.ipv4.tcp_fin_timeout = 30
应用:
sudo sysctl -p
-Xms4g -Xmx4g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
✅ 建议:
| 场景 | 推荐 GC |
|---|---|
| 低延迟 | G1GC |
| 大堆(>32G) | ZGC |
| 吞吐优先 | Parallel GC |
示例(ZGC):
-XX:+UseZGC
-Xmx16g
Debian 上跑容器时非常重要:
-XX:+UseContainerSupport
-XX:MaxRAMPercentage=75
避免:
-Xmx 写死
-Xlog:gc*,gc+heap=info,gc+age=trace
或 JDK 17+:
-Xlog:gc*:file=gc.log:time,uptime,level,tags
SoftReference / WeakReferencenew ThreadPoolExecutor(
corePoolSize,
maxPoolSize,
keepAliveTime,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(queueSize)
);
❌ 避免:
Executors.newCachedThreadPool()jps -l
top -H -p <pid>
jstack <pid>
jmap -histo <pid>
/dev/urandom)-Djava.security.egd=file:/dev/./urandom
java \
-Xms8g -Xmx8g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+UseContainerSupport \
-XX:MaxRAMPercentage=75 \
-Djava.security.egd=file:/dev/./urandom \
-jar app.jar
你可以告诉我:
我可以直接给你一套 针对你场景的 JVM 参数。