Java程序在CentOS上运行缓慢怎么解决
小樊
34
2025-12-27 04:59:22
Java在CentOS上变慢的排查与优化步骤
一、快速定位瓶颈
- 系统资源:用top/htop查看CPU、内存占用;用vmstat 1观察是否有si/so(swap);用iostat -x 1查看磁盘await、svctm、util。
- JVM层面:用jstat -gcutil 1000观察YGC/YGCT、FGC/FGCT与停顿;用jstack -l 抓取线程栈,定位RUNNABLE/BLOCKED/WAITING;用jmap -heap 看堆配置与使用情况,必要时导出堆转储jmap -dump:live,format=b,file=heap.hprof 并用MAT分析泄漏。
- 线程热点定位:用ps -mp -o THREAD,tid,times --sort=-%cpu找出高CPU线程,将其TID转16进制,在jstack中检索对应线程的栈。
- Web容器(如Tomcat):检查maxThreads/acceptCount,优先使用NIO/NIO2;必要时用VisualVM/JConsole远程监控。
二、JVM调优要点
- 堆与元空间:将**-Xms与-Xmx设为相同值(如-Xms4g -Xmx4g**)避免运行期扩堆抖动;年轻代建议为堆的1/3~1/2(如**-Xmn2g**);元空间设置上限(如**-XX:MaxMetaspaceSize=256m**)防止无界增长。
- GC策略选择:
- 低延迟/大堆:优先G1GC(如**-XX:+UseG1GC -XX:MaxGCPauseMillis=200**);
- 吞吐量优先(批处理):Parallel GC(如**-XX:+UseParallelGC -XX:ParallelGCThreads=4**);
- 超大堆与极低停顿:在支持的JDK版本上考虑ZGC(如**-XX:+UseZGC**)。
- GC日志:开启**-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/java/gc.log**,必要时加**-XX:+PrintHeapAtGC -XX:+PrintReferenceGC**,用GCViewer/GCEasy分析频率与时长。
- 启动与随机数:启用类数据共享 -Xshare:on缩短启动时间;将**/etc/java-/jre/lib/security/java.security中的securerandom.source改为file:/dev/urandom**以避免熵不足导致阻塞。
三、系统与容器配置优化
- 精简自启与释放资源:用systemctl list-unit-files --type=service查看并禁用不需要的服务(如bluetooth、cups)。
- 内核与内存:在**/etc/sysctl.conf中调优,如vm.swappiness=10**(减少换页)、net.core.somaxconn=1024(增大连接队列)、net.ipv4.tcp_tw_reuse=1(复用TIME_WAIT);执行sysctl -p生效。
- 文件系统与I/O:挂载时使用noatime,nodiratime降低元数据写入;选择XFS/ext4,高并发/大文件场景更偏向XFS。
- 交换策略:内存紧张可启用ZRAM(如zram-tools)提升交换效率。
- Web容器:Tomcat将maxThreads/acceptCount调优为与业务并发匹配,禁用AJP,采用NIO/NIO2提升I/O。
四、代码与数据访问优化
- 减少对象创建:避免在循环中频繁new临时对象,字符串拼接用StringBuilder;复用昂贵对象(连接、线程、缓冲区)。
- 数据结构与算法:随机访问用ArrayList,频繁插入/删除用LinkedList;键值对用HashMap/ConcurrentHashMap;优化复杂度(如O(n log n)排序替代O(n²))。
- 并发与锁:缩小synchronized范围,优先使用ConcurrentHashMap/AtomicInteger等并发类,避免死锁并合理设置超时。
- 数据库:使用HikariCP等连接池(如maximum-pool-size=20),SQL加索引、避免SELECT 、采用批量插入;必要时懒加载*关联数据。
- 缓存:热点数据用Caffeine/Guava Cache降低远程调用与数据库压力。
五、验证与持续监控
- 压测与回归:用JMeter在预发环境模拟真实并发,对比TPS、P95/P99延迟、错误率;每次只变更少量参数并保留基线。
- 可视化与告警:用VisualVM/JProfiler做CPU热点与内存泄漏分析;生产建议Prometheus + JMX Exporter采集JVM指标并配置阈值告警。
- 变更记录:将JVM参数、内核参数、容器配置与压测结果纳入版本化记录,便于回滚与复盘。