1. 背景
虽然大多数应用程序使用JVM的默认设置就能很好地工作,仍然有不少应用程序需要对JVM进行额外的配置才能达到其期望的性能要求。现在JVM为了满足各种应用的需要,为程序运行提供了大量的JVM配置选项。不幸的是,针对一个应用程序进行的JVM调优(配置)可能并不适用于另一个应用程序。
注意:为了达到应用程序的系统需求,可能需要进行多次迭代才能获得应用程序干系人满意的程序性能。
2. 应用程序的系统需求
吞吐量、响应时间、内存消耗量、可用性、可管理性等。
1. 可用性
可用性是对应用程序处于可操作,可使用状态的度量。可用性需求指的是当引用程序的某些组件发生故障或失效时,应用程序或应用程序的一部分在多大程度上还可以继续提供服务。
2. 可管理性
可管理性是对由运行,监控应用程序而产生的操作性开销的度量,同时也包含了配置应用程序的难易程度。
3. 吞吐量
吞吐量是对单位时间内处理工作量的度量。设计吞吐量需求时,一般不考虑它对延迟或响应时间的影响。通常情况下,增加吞吐量的代价是延迟的增加或内存使用的增加。
4. 延迟及响应性
延迟或响应性是对应用程序收到指令开始工作直到完成该工作消耗时间的度量。定义延迟或响应性需求时并不考虑程序的吞吐量,通常情况下,提高响应性或缩小延迟的代价是更低的吞吐量或更多的内存消耗。
5. 内存占用
内存占用指的同等程度的吞吐量,延迟,可用性和可管理性前提下,运行应用程序所需的内存大小。内存占用通常以运行应用程序需要的Java堆大小或运行应用程序需要的总内存大小来表述。一般情况下,通过增大Java堆的方式增加可用内存能够提高吞吐量,降低延迟或兼顾两者。
6. 启动时间
启动时间是应用程序初始化所消耗的时间。
3. JVM部署模式
JVM部署模式选择指的是将应用程序部署到单个JVM实例上,还是部署到多个JVM实例上。
1. 单JVM部署模式
采用单JVM部署模式的应用程序存在单点故障的问题。
2. 多JVM部署模式
将JVM应用程序部署到多个JVM实例能够获得更好的可用性,以及更低延迟的可能性。
多JVM部署模式可能提供更低的延迟,这是因为多JVM部署模式下,Java堆通常比较小,较小的堆在垃圾收集时产生的停顿更小。通常情况下,垃圾收集锁产生的停顿是影响应用程序延迟性的最主要因素。
一般情况下,使用的JVM数目越少越好,监控和管理成本就越低,消耗的总内存也更少。
4. JVM运行模式
1. Client模式或Server模式
HotSpot VM有2中运行模式:Client模式、Server模式、Tiered Server模式。
Client模式的特点是启动快、占用内存少、JIT编译器生成代码的速度也更快。
Server模式则提供了更复杂的生成码优化功能,这个功能对于服务器应用而言尤其重要。大多数Server模式的JIT编译优化都要消耗额外的时间以收集更多的应用程序行为信息、为应用程序运行生成更优的生成码。
Tiered Server模式结合了Client和Server运行模式的长处,即快速启动和高效的生成码。通过-server -XX:+TieredCompilation命令行选项可以启动Tiered Server模式。