这里总结一下,Java 性能调优的方法:
- 代码层面
- String 使用优化
- 循环拼接字符串显式使用 StringBuilder
- JDK 从 6 到 7、8 到 9 对 String 是一直在优化的
- 正则表达式
- 少用捕获组
- 贪婪模式会带来回溯,多用独占模式和懒惰模式
- ArrayList 和 LinkedList
- 使用 ArrayList 时尽量给定合适的初始化容量
- 在头部插入删除元素时,LinkedList 性能好
- 在中间和尾部插入删除元素时,ArrayList 性能好
- JDK8 Stream
- 数据量小或单核机器使用常规迭代性能好,量大且多核机器使用并行 stream 性能好
- 串行 stream 性能没有常规迭代好
- NIO
- DirectBuffer 减少了用户空间到内核空间的内存复制
- RPC 通信
- 使用长连接
- 合适的序列化方法
- String 使用优化
- 多线程
- 无锁化
- 线程间不共享可变对象
- 轻自旋锁 CAS
- 锁粒度优化
- 减小锁粒度,比如相比 HashTable,ConcurrentHashMap 采用分段锁优化后性能大幅提升
- 锁粗化,多个相邻的同步块,可以合并成一个
- CPU 绑定,减少 Cache 失效
- 协程
- 无锁化
- 性能剖析方法
- jmap 看内存布局
- jstack 看线程堆栈
- JMC、JProfiler 看热点代码