在 Debian 上优化 Java 性能,通常可以从 系统层面、JVM 层面、应用层面 三个方向入手。下面给你一套较为完整、实用的优化思路(适用于服务器环境,如 Debian 10/11/12)。
uname -a
Java 对 GC 非常敏感,Swap 会导致 GC 停顿剧增。
# 临时关闭
sudo swapoff -a
# 永久关闭(编辑 /etc/fstab,注释 swap 行)
如果不能完全关闭,至少降低 swappiness:
echo 1 | sudo tee /proc/sys/vm/swappiness
Java 应用(尤其是 Netty、Tomcat、Elasticsearch)很吃 fd。
# 查看
ulimit -n
# 永久修改
sudo vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
并确保:
sudo vim /etc/systemd/system.conf
DefaultLimitNOFILE=65535
避免 CPU 处于节能模式:
sudo apt install cpufrequtils
sudo cpufreq-set -g performance
或(systemd 系统):
sudo systemctl disable ondemand
sudo apt install wget apt-transport-https
wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/adoptium.gpg
echo "deb https://packages.adoptium.net/artifactory/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/adoptium.list
sudo apt update
sudo apt install temurin-17-jdk
-XX:+UseG1GC
-XX:+UseZGC
-XX:+UseParallelGC
❌ 错误示例:
-Xms512m -Xmx8g
✅ 推荐:
-Xms4g -Xmx4g
原因:避免堆动态扩容带来的性能抖动。
java \
-Xms4g -Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+DisableExplicitGC \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/java \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-Xloggc:/var/log/java/gc.log \
-jar app.jar
-Djava.awt.headless=true
-Dfile.encoding=UTF-8
CPU 核心数 + 1CPU 核心数 * 2 ~ 4jstat -gc <pid> 1000
jstack <pid>
jmap -heap <pid>
top
htop
vmstat 1
| 问题 | 解决 |
|---|---|
| 使用了 OpenJDK 但性能差 | 换 Temurin / GraalVM |
| 启动慢 | 关闭 Swap + 固定堆 |
| GC 停顿 | 换 G1 / ZGC |
| 随机卡顿 | 检查 IO、fd、swappiness |
| 容器里跑 Java | 加 -XX:+UseContainerSupport |
Debian 上 Java 性能优化的核心:稳定系统环境 + 正确 JVM + 合理 GC + 监控调优
如果你愿意,可以告诉我:
我可以给你一套 针对你场景的 JVM 参数模板。