温馨提示×

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参数、内核参数、容器配置与压测结果纳入版本化记录,便于回滚与复盘。

0