1. 定位性能瓶颈
要解决Java在CentOS上运行慢的问题,首先需要精准定位瓶颈所在。常用工具和方法包括:
ps -mp <PID> -o THREAD,tid,timesort-rn),找到消耗CPU的核心线程;jstack -l <PID> | grep <TID> -a60 > thread_log.txt),分析线程状态(如BLOCKED、WAITING),定位死锁、锁竞争或长时间阻塞的代码段;jstat -gcutil <PID> 1000,每秒刷新一次),查看GC次数、停顿时间及老年代/新生代使用率,判断是否存在内存泄漏或GC频繁问题。2. 优化JVM配置
合理的JVM参数是提升Java性能的核心。关键调整项包括:
-Xms)和最大堆(-Xmx),建议两者相等(如-Xms4g -Xmx4g),避免堆内存动态扩展带来的性能损耗;-XX:+UseG1GC),它适合大内存应用,能平衡吞吐量和停顿时间;可进一步调整G1参数,如最大GC停顿时间(-XX:MaxGCPauseMillis=200,单位毫秒)、新生代与老年代比例(-XX:NewRatio=3,新生代占1/4);-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log),通过工具(如GCViewer)分析日志,识别GC瓶颈(如Full GC频繁)。3. 代码层性能优化
代码效率直接影响Java应用的运行速度,需重点关注:
StringBuilder代替字符串拼接str += "x"),重用对象(如数据库连接、线程池);ArrayList而非LinkedList,频繁插入/删除用LinkedList);优化算法复杂度(如用快速排序替代冒泡排序);ConcurrentHashMap替代synchronized HashMap),降低锁粒度(如分段锁);try-with-resources、清空集合),使用MAT(Memory Analyzer Tool)分析堆转储文件(jmap -dump:live,format=b,file=heap.hprof <PID>),定位内存泄漏点(如未关闭的流、静态集合持有对象引用)。4. 系统资源与配置优化
系统资源不足或配置不合理会导致Java应用运行缓慢,需调整:
systemctl list-unit-files --type=service查看开机自启服务,禁用不需要的服务(如systemctl disable bluetooth),释放CPU和内存;/etc/sysctl.conf,优化TCP和内存参数(示例):net.ipv4.tcp_tw_reuse = 1 # 复用TIME_WAIT连接
net.ipv4.tcp_tw_recycle = 1 # 快速回收TIME_WAIT连接(CentOS 7+需谨慎使用)
vm.swappiness = 10 # 减少内存交换(值越小越优先使用物理内存)
net.core.somaxconn = 1024 # 增加TCP连接队列长度
执行sudo sysctl -p使配置生效;noatime(不记录文件访问时间)和nodiratime(不记录目录访问时间)选项(如mount -o remount,noatime,nodiratime /),减少磁盘I/O;5. 监控与持续优化
性能优化是一个持续过程,需通过工具持续监控:
top、htop(更直观)监控CPU和内存;vmstat 1监控虚拟内存(如si/so表示交换分区使用情况);iostat 1监控磁盘I/O(如await表示平均I/O等待时间);