Java 性能权威指南 | 8.1
软件运行性能是一个不可回避的问题。本书内容较新,包含 G1 回收器相关内容,对各种垃圾收集器的工作原理及调整方式都给出了较为详细的说明。同时还介绍了一些性能调优工具的用法,以便先定位问题,再进行针对性的解决。
一些普适性的建议:
- 过早考虑优化是所有噩梦的根源
- 优化代码的目的是提升而不是降低(更短时间段内的)CPU 使用率
- Serial 收集器最适用于应用程序的内存使用少于 100MB 的场景
- 一般情况下,堆空间小于 4GB 时,CMS 收集器的性能比 G1 收集器好
- 使用大型堆或巨型堆时,由于 G1 收集器可以分割工作,通常它比 CMS 收集器表现更好
- 除非应用程序需要比默认值更大的堆,否则在进行调优时,尽量考虑通过调整 GC 算法的性能目标,而非微调堆的大小来改善程序性能
- 如果机器上同时运行了多个 JVM 实例,限制所有 JVM 使用的线程总数是个不错的主意
- 多个 JVM 运行于同一台物理机上时,依据公式计算出的线程数可能过高,必须进行优化(减少)
- 如果堆容量的最大、最小值设置成同样的值,与此同时新生代的初始值和最大值也设置为同样大小,自适应调整的功能会被关闭
- 通常情况下,我们应该开启自适应调整,因为垃圾回收算法依赖于调整后的代的大小来达到它停顿时间的性能目标