在 Ubuntu 上优化 Java 性能,通常可以从系统层面、JVM 层面、应用层面和监控调优四个方向入手。下面给你一份实用清单(以生产服务器为主,开发机可酌情简化)。
Java 高并发应用很容易遇到:
Too many open files
编辑:
sudo vim /etc/security/limits.conf
添加:
* soft nofile 65536
* hard nofile 65536
用户重新登录或重启生效。
Swap 会严重影响 Java GC 性能。
sudo sysctl vm.swappiness=10
永久生效:
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
如内存充足,可直接关闭 swap:
sudo swapoff -a
sudo apt install linux-tools-common
sudo cpupower frequency-set -g performance
java -version
常见组合:
| 场景 | 推荐 GC |
|---|---|
| 低延迟 | G1 / ZGC |
| 高吞吐 | Parallel GC |
| 超大堆 | ZGC / Shenandoah |
示例(G1):
java -XX:+UseG1GC \
-Xms4g -Xmx4g \
-jar app.jar
ZGC(JDK 17+):
-XX:+UseZGC -Xmx8g
-Xms = -Xmx(避免动态扩容)-XX:+UseContainerSupport
-Xlog:gc*:file=gc.log:time,level,tags
ConcurrentHashMapsynchronized 大块代码top
htop
vmstat 1
iostat -x 1
jps
jstat -gc <pid> 1000
jstack <pid>
jmap -heap <pid>
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
-XX:+UseContainerSupport
-XX:MaxRAMPercentage=75
避免 JVM 不知道容器内存限制。
java \
-XX:+UseG1GC \
-Xms4g -Xmx4g \
-XX:MaxGCPauseMillis=200 \
-XX:+UseContainerSupport \
-XX:MaxRAMPercentage=75 \
-Xlog:gc*:file=/var/log/gc.log \
-jar app.jar
如果你愿意,可以告诉我:
我可以给你更精确的 JVM 参数。