1.应用程序的系统需求:
应用程序的系统需求是应用程序运行时某方面的要求,譬如吞吐量、响应时间、内存消耗量、可用性、可管理性等。JVM性能调优主要针对如下的系统需求:
(1).可用性:
是对应用程序处于可操作、可使用状态的度量。可用性需求指的是当程序的某些组件发生故障或失效时,应用程序或应用程序的一部分在多大程度上海可以继续提供服务。
Java应用程序的上下文中,利用应用程序组件化、在多个JVM中运行或在多个JVM上运行多个应用程序实例都可以实现高可用性。强调高可用性的代价之一是管理成本的增加,引入更多的JVM意味着要管理更多的JVM,从而导致复杂性增加以及随之而来的管理成本。
(2).可管理性:
可管理性是对由运行、监控应用程序而产生的操作性开销的度量,同时也包含了配置应用程序的难易程度。可管理性需求用于衡量系统管理的难易程度。
(3).吞吐量:
吞吐量是堆单位时间内处理工作量的度量。设计吞吐量需求时,一般不考虑它对延迟或者响应时间的影响。
通常情况下,增加吞吐量的代价是延迟的增加或者内存使用的增加。
(4).延迟及响应性:
延迟或者响应性是指应用程序收到指令开始工作直到完成该工作所消耗时间的度量。
定义延迟及响应性需求时,一般不考虑程序吞吐量,通常情况下,提高响应性或缩小延迟的代价是更低吞吐量、或者更多的内存消耗(或者二者同时发生)。
(5).内存占用:
内存占用是指在同等程度的吞吐量、延迟、可用性和可管理性前提下,运行应用程序所需的内存大小。
内存占用通常以运行应用程序所需的java堆大小或者运行应用程序所需的总内存大小来表述。一般情况下,通过增大java堆的方式增加可用内存能够提供吞吐量、降低延迟或者兼顾二者。
(6).启动时间:
启动时间是应用程序初始化所消耗时间。此外,java应用程序中另一个值得关注的指标是现代JVM完成应用程序热区优化,初始化所消耗的时间。
Java应用程序初始化的完成时间取决于很多因素,包括(但不限于):初始化时载入的类的数量、需要初始化的对象的数量、这些对象如何初始化以及HotSpot VM的运行时环境选择,即Client模式还是Server模式。
2.JVM部署模式选择:
JVM部署模式的选择是指将应用程序部署到单个JVM实例上,还是部署到多个JVM实例上。
(1).单JVM部署模式:
将java应用部署在单个JVM上时,由于不需要管理多个JVM,可以降低管理成本,此外每个部署的JVM都有相应的内存开销,使用单JVM避免了这部分资源使用,应用程序所消耗的总内存数量会减少。
单JVM部署模式存在单点故障,即当应用程序遭遇灾难性错误或JVM失效时,无法保证应用程序的可用性。
另外,如果应用内存消耗超过了32位JVM处理能力时,需要使用64位JVM,需要确认所使用的第三方模块是否支持64位JVM,如果还使用了JNI,需要使用64位编译器编译。
(2).多JVM部署模式:
将java应用部署到多个JVM实例能够获得更好的可用性,以及更低延迟的可能性。采用多JVM部署模式时,单一应用程序或JVM实例的失效只会影响整个应用程序的部分功能。同时由于在多JVM部署模式下,java堆通常比较小,较小的堆在垃圾收集时产生的停顿更小,因此多JVM部署模式可能提供更低的延迟。另外,采用多JVM部署模式由于将负荷分发到多个JVM,能够改善应用程序的扩展性,从而处理更高负荷,提供吞吐量。
3.JVM运行模式选择:
(1).Client/Server模式:
A.Client模式:特点是启动快、占用内存少、JIT编译器生成代码的速度也更快,但是JIT编译优化的代码质量不如Server模式高。
B.Server模式:JIT编译优化需要消耗额外的时间以收集更多的应用程序行为,启动时间更长,但是能生成高度优化的机器码。
C.Tiered Server模式:在JDK7中正式发布,结合了Client和Server模式的优点,即快速启动和高效的生成码。如果使用的是java7或更新的版本的JVM,可以使用”-server -XX:+TieredCompilation”命令行选项启动Tiered Server模式。
(2).32位/64位:
HotSpot VM默认使用32位运行模式,但是服务器的硬件配置、第三方库是否支持64位JVM以及JNI是否使用64位编译也决定是否适合使用64位JVM。
A.32位JVM:
默认的HotSpot VM运行模式,java堆内存小于2G的推荐选择。
B.64位JVM:
当java堆介于2G~32G时,使用”-d64 -XX:+UseCompressedOops”命令行选项的64位JVM。
当java堆大于32G时,使用”-d64”命令行选项的64位JVM。
注意:使用” -XX:+UseCompressedOops”命令行选项的HotSpot VM,最大jav