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
)。