CentOS上Java运行缓慢优化方法
优化前需先明确瓶颈根源,常用工具组合:
合理配置堆内存与非堆内存,避免频繁GC:
-Xms4g -Xmx4g),避免堆内存动态扩展带来的性能损耗;-Xmn2g),减少年轻代晋升到老年代的对象数量;-XX:MaxMetaspaceSize=256m),防止元空间溢出。根据应用特点选择合适的GC策略:
-XX:+UseG1GC -XX:MaxGCPauseMillis=200(目标最大停顿200ms);-XX:+UseCMSCompactAtFullCollection使用;-XX:+UseParallelGC -XX:ParallelGCThreads=4(4个线程)。开启GC日志,便于后续分析:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/java/gc.log(输出到指定文件);-XX:+PrintHeapAtGC(GC前后堆内存详情)、-XX:+PrintReferenceGC(引用对象回收情况);String str = new String("abc")),改用StringBuilder(线程不安全但效率高);ArrayList(O(1)),频繁插入/删除用LinkedList(O(1));键值对存储用HashMap(O(1)),线程安全用ConcurrentHashMap(分段锁);synchronized块缩小至最小必要代码段;ConcurrentHashMap替代HashMap+synchronized,AtomicInteger替代int+synchronized;tryLock)。systemctl list-unit-files --type=service列出所有服务,禁用不需要的服务(如bluetooth、cups):systemctl disable <service_name>;systemctl disable <service_name>(仅禁用当前启动项)。编辑/etc/sysctl.conf,优化网络与内存参数:
net.ipv6.conf.all.disable_ipv6=1(减少网络协议栈开销);vm.swappiness=10(降低系统使用Swap的倾向,10表示仅在内存不足10%时使用Swap);net.ipv4.tcp_syncookies=1(防止SYN Flood攻击)、net.ipv4.tcp_max_syn_backlog=8192(增加SYN队列长度);sysctl -p。sudo yum install zram-tools;sudo systemctl enable zramswap.service && sudo systemctl start zramswap.service;@Lazy注解);basePackages指定具体包路径)。-Xshare:on(类数据共享),将常用类加载到共享内存,减少JVM启动时的类加载时间(适用于多个JVM实例的场景);java -Xshare:on -jar myapp.jar。/etc/java-<version>/jre/lib/security/java.security文件,将securerandom.source=file:/dev/random改为securerandom.source=file:/dev/urandom(/dev/urandom是非阻塞的,提升随机数生成速度);Cache<String, Object> cache = Caffeine.newBuilder().maximumSize(1000).build();。spring.datasource.hikari.maximum-pool-size=20);SELECT *、使用批量插入(INSERT INTO table VALUES (?, ?), (?, ?));fetch = FetchType.LAZY)。