CentOS Java运行慢优化指南
在优化前,需先通过工具定位具体瓶颈(如CPU、内存、GC、锁竞争等):
top命令查看占用CPU高的Java进程PID;用ps -mp <PID> -o THREAD,tid,time找出进程内占用CPU高的线程ID;通过jstack <PID> > thread_dump.log导出线程快照,分析线程状态(如BLOCKED、WAITING)及阻塞原因。-XX:+PrintGCDetails -Xloggc:/path/to/gc.log),分析垃圾回收频率、停顿时间及内存回收效率;使用jstat -gcutil <PID> 1000实时监控堆内存各区域(Eden、Survivor、Old)的使用率及GC情况。根据应用内存需求设置-Xms(初始堆大小)和-Xmx(最大堆大小),建议两者值相等(避免堆扩展时的停顿)。例如:
-Xms4g -Xmx4g(适用于4GB内存需求的应用)。
过小的堆会导致频繁GC,过大的堆会增加Full GC时间。
-XX:+UseG1GC开启,可设置最大GC停顿时间(如-XX:MaxGCPauseMillis=200,单位毫秒)。通过-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/java/gc.log将GC日志输出到文件,使用GCViewer或GCEasy工具分析日志,优化GC策略(如调整新生代与老年代比例-XX:NewRatio)。
String str = new String("xxx")),改用字符串池(String str = "xxx")。StringBuilder代替字符串拼接),或使用对象池(如Apache Commons Pool)管理高频使用的对象(如数据库连接、线程)。ArrayList(随机访问快)代替LinkedList(插入/删除快但随机访问慢);HashMap(O(1)查找)代替TreeMap(O(log n)查找)。ConcurrentHashMap代替HashMap+synchronized),减少锁粒度。ReadWriteLock实现读写分离(读多写少场景)。/etc/sysctl.conf,添加vm.swappiness=10(值越小,越少使用Swap),执行sysctl -p生效。net.ipv4.tcp_fin_timeout=30(TCP连接超时时间)、net.ipv4.tcp_max_syn_backlog=8192(SYN队列长度),提升网络处理能力。使用systemctl list-unit-files --type=service列出所有服务,禁用不必要的服务(如firewalld、postfix):
systemctl stop firewalld && systemctl disable firewalld,减少系统资源占用。
ext4或XFS文件系统(XFS支持更大文件和高并发),挂载时添加noatime选项(减少文件访问时间更新):mount -o remount,noatime /。Nginx做动静分离(静态资源由Nginx直接返回,减少Java应用压力)。Redis缓存热点数据(如用户信息、商品详情),设置合理的过期时间(如EXPIRE key 3600,1小时过期),避免重复数据库查询。Spring Async或CompletableFuture实现异步方法(如发送邮件、生成报表),避免阻塞主线程。RabbitMQ、Kafka)解耦耗时操作(如订单处理),提高系统吞吐量。懒加载(@Lazy注解)延迟加载非必要组件(如DAO层)。-Xshare:on开启类数据共享(CDS),减少JVM启动时的类加载时间(适用于多个JVM实例的场景)。使用最新的LTS版本(如JDK 17、21),新版本通常包含性能改进(如JIT编译器优化、GC算法优化)和bug修复,能显著提升Java应用性能。