调整线程池大小
合理设置线程池的核心线程数(corePoolSize)和最大线程数(maximumPoolSize)。CPU密集型任务建议线程数接近CPU核心数,IO密集型任务可适当增加线程数。通过-XX:ActiveProcessorCount可显式指定JVM识别的CPU核心数。
选择合适垃圾收集器
针对高并发场景,G1(Garbage-First)或ZGC更适合低延迟需求,CMS已逐步淘汰。启用G1的参数示例:
-XX:+UseG1GC -XX:MaxGCPauseMillis=200
ZGC需JDK11+,参数:
-XX:+UseZGC
锁优化与无锁设计
减少synchronized使用,优先考虑java.util.concurrent包的并发工具(如ReentrantLock、ConcurrentHashMap)。启用偏向锁(Biased Locking)可降低无竞争锁开销:
-XX:+UseBiasedLocking
但JDK15后默认禁用,需评估场景。
内存分配优化
调整年轻代与老年代比例避免频繁GC。例如,增大年轻代减少晋升到老年代的对象:
-Xmn512m -XX:NewRatio=2
启用TLAB(Thread-Local Allocation Buffers)减少分配冲突:
-XX:+UseTLAB
监控与诊断工具
使用jstack导出线程快照分析死锁或阻塞,jstat -gcutil监控GC状态,jvisualvm或Arthas实时观察线程状态。结合-XX:+PrintGCDetails日志分析GC对线程的影响。
避免伪共享
通过@Contended注解(需-XX:-RestrictContended)或字段填充(Padding)解决CPU缓存行伪共享问题,提升多线程性能。示例:
class Data {
@Contended
volatile long value;
}
调整JIT编译策略
对于长期运行的线程热点代码,调整编译阈值加速优化:
-XX:CompileThreshold=10000
关闭分层编译(TieredCompilation)可能在某些场景提升稳定性:
-XX:-TieredCompilation
关键参数总结
| 场景 | 推荐参数 |
|---|---|
| 高并发低延迟 | -XX:+UseZGC -XX:SoftRefLRUPolicyMSPerMB=50 |
| 吞吐优先 | -XX:+UseG1GC -XX:G1HeapRegionSize=8m |
| 线程竞争严重 | -XX:+UseSpinning -XX:PreBlockSpin=10 |
注:需结合具体应用压力测试验证参数效果,不同JDK版本参数可能存在差异。



1119

被折叠的 条评论
为什么被折叠?



