在 Ubuntu 下优化 Java 性能,通常可以从 系统层、JVM 层、应用层、监控与调优工具 四个维度来做。下面给你一个比较实用、可落地的优化思路。
编辑 /etc/sysctl.conf 或 /etc/sysctl.d/99-java.conf:
# 提高文件描述符上限
fs.file-max = 1000000
# TCP 优化(高并发场景)
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 虚拟内存
vm.swappiness = 10
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
执行:
sysctl -p
ulimit -n 100000
永久生效(/etc/security/limits.conf):
* soft nofile 100000
* hard nofile 100000
ext4 或 xfsecho none > /sys/block/sda/queue/scheduler
systemctl disable bluetooth
systemctl disable cups
查看版本:
java -version
java -Xms4g -Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-jar app.jar
java -Xms4g -Xmx4g \
-XX:+UseZGC \
-XX:+ZGenerational \
-jar app.jar
-XX:+UseParallelGC
| 参数 | 作用 |
|---|---|
-Xms / -Xmx |
堆内存大小(建议相等) |
-XX:MaxMetaspaceSize |
防止 Metaspace 无限增长 |
-XX:+HeapDumpOnOutOfMemoryError |
OOM 自动 dump |
-XX:+PrintGCDetails |
GC 日志 |
-XX:+AlwaysPreTouch |
启动时预热内存 |
示例:
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
maxThreads=200
acceptCount=100
maximumPoolSize=20
connectionTimeout=30000
ConcurrentHashMapsynchronized 大方法ThreadLocaltop
htop
vmstat 1
iostat -x 1
jps
jstat -gc <pid> 1000
jmap -heap <pid>
jstack <pid>
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
-Xlog:gc*:file=gc.log:time
分析工具:
如果你愿意,可以告诉我:
我可以给你一套 针对性的 JVM 参数和调优方案。