调整 Java 虚拟机

尽管 JVM 调整操作随 JVM 提供程序的不同而有所变化,但一般的调整概念适用于所有 JVM。这些一般的概念包括:

编译器调整。在服务器运行时期间,所有JVM都使用即时(JIT)编译器来将Java字节码编译为本机指令。

Java内存或堆调整。JVM内存管理功能(即垃圾回收)为提高JVM性能提供了其中一种最大的可能性。

类装入调整。

过程

优化启动性能和运行时性能

在某些环境中,优化WebSphereApplicationServer的启动性能比优化运行时性能更重要。在另一些环境中,优化运行时性能更为重要。缺省情况下,IBMJVM是针对运行时性能进行优化的,而基于HotSpot的JVM是针对启动性能进行优化的。

JavaJIT编译器在很大程度上决定了是优化启动性能还是优化运行时性能。编译器使用的初始优化级别影响编译类方法所耗用的时间以及启动服务器所耗用的时间。为了提高启动速度,可以降低编译器所使用的初始优化级别。这意味着,由于现在使用较低的优化级别来编译类方法,所以应用程序的运行时性能可能会下降。

因为编译器在运行时执行阶段会根据自己的判断来重新编译类方法以提高性能,所以,很难提供一个有关特定的运行时性能影响的说明。最终,应用程序的持续时间是影响运行时性能下降程度的主要原因。运行时间较短的应用程序的方法被重新编译的可能性较高。运行时间较长的应用程序的方法被重新编译的可能性较低。IBMJVM的缺省设置是使用高优化级别来执行初始编译。如果需要更改此行为,可以使用以下IBMJVM选项:

-Xquickstart

此设置影响IBMJVM使用较低优化级别来编译类方法的方式,这将提高服务器启动速度,但会使运行时性能下降。缺省情况下,如果未指定此参数,IBMJVM最初将使用较高的初始优化级别来执行编译。此设置能够提高运行时性能,但会减慢服务器启动速度。

缺省值:高初始编译器优化级别

建议值:高初始编译器优化级别

用法:-Xquickstart可以加快服务器启动速度。

基于Sun的Hotspot技术的JVM最初使用低优化级别来编译类方法。使用下列JVM选项来更改此行为:

-server

基于Sun的Hotspot技术的JVM最初使用低优化级别来编译类方法。这些JVM使用简单编译器和能够进行优化的JIT编译器。通常情况下,使用简单JIT编译器。然而,可以通过设置此选项来使用能够执行优化的编译器。此更改将显著提高服务器的性能,但使用能够执行优化的编译器时,服务器的预备时间将会较长。

缺省值:简单编译器

建议值:能够执行优化的编译器

用法:-server启用能够执行优化的编译器。

设置堆大小下列命令行参数对于设置堆大小来说很有用。

-Xms

此设置控制Java堆的初始大小。正确调整此参数有助于降低垃圾回收开销,从而缩短服务器响应时间并提高吞吐量。对于某些应用程序来说,此选项的缺省设置可能会太低,从而导致发生大量小型垃圾回收。

缺省值:256MB

建议值:随工作负载的不同而有所变化,但高于缺省值。

用法:-Xms256m将初始堆大小设置为256兆字节

-Xmx

此设置控制Java堆的最大大小。正确调整此参数有助于降低垃圾回收开销,从而缩短服务器响应时间并提高吞吐量。对于某些应用程序来说,此选项的缺省设置可能会太低,从而导致发生大量小型垃圾回收。

缺省值:512MB

建议值:随工作负载的不同而有所变化,但高于缺省值。

用法:-Xmx512m将最大堆大小设置为512兆字节

-Xlp

此设置可以与IBMJVM配合使用,以使用大页来分配堆。然而,如果使用此设置,那么必须将操作系统配置为支持大页。使用大页可以降低CPU跟踪堆内存时的开销,并且还允许创建较大的堆。

请参阅调整操作系统以了解有关调整操作系统的更多信息。

应该指定的堆大小取决于不同时段的堆使用情况。在堆大小频繁更改的情况下,对Xms和Xmx参数指定相同的值可以提高性能。

调整IBMJVM的垃圾回收器。

使用Java-X选项来查看内存选项列表。

-Xgcpolicy

将gcpolicy设置为optthruput会禁用并发标记。如果没有暂停时间问题(表现为应用程序响应时间不规律),那么应该使用此选项来实现最大吞吐量。将gcpolicy设置为optavgpause会使用缺省值来启用并发标记。此设置将减少由正常垃圾回收所引起的应用程序响应时间不规律情况。然而,此选项可能会降低整体吞吐量。

缺省值:optthruput

建议值:optthruput

用法:Xgcpolicy:optthruput

-Xnoclassgc

缺省情况下,当一个类没有任何活动实例时,JVM就会从内存中卸装该类,但是这样会使性能下降。如果关闭类垃圾回收,就可以消除由于多次装入和卸装同一个类而造成的开销。

如果不再需要某个类,那么该类在堆中所占用的空间通常将用于创建新对象。但是,如果应用程序通过创建类的新实例来处理请求,并且该应用程序的请求是随机出现的,那么可能会发生以下情况:先前请求者完成后,正常的类垃圾回收将通过释放这个类占用的堆空间来清除这个类,但当下一个请求出现时,又必须将这个类重新实例化。在这种情况下,您可能想使用此选项来禁用类垃圾回收。

缺省值:启用类垃圾回收

建议值:禁用类垃圾回收

用法:Xnoclassgc禁用类垃圾回收

有关其他信息,请参阅下列DeveloperWorks文章:

http://www.ibm.com/developerworks/java/

调整SunJVM的垃圾回收器

在Solaris平台上,WebSphereApplicationServer在SunHotspotJVM上运行,而不是在IBMJVM上运行。对SunJVM使用正确的调整参数以利用其性能优化功能十分重要。

SunHotspotJVM依靠分代垃圾回收来实现最佳性能。下列命令行参数对于调整垃圾回收来说非常有用。

-XX:SurvivorRatio

将Java堆划分为旧对象(长生命周期对象)区域和新对象区域。新对象区域进一步细分为两部分,第一部分用于分配给新对象(初始区域),第二部分存放那些经过其前几次垃圾回收之后、但在被提升为旧对象之前仍在使用中的新对象(幸存者空间)。幸存者比率是堆的新对象区域中初始区域与幸存者空间的比率。增大此设置将针对需要创建大量对象但仅保留少量对象的应用程序优化JVM。与其他应用程序相比,WebSphereApplicationServer会生成更多中等生命周期对象和长生命周期对象,因此,应该将此设置设置为小于缺省值。

缺省值:32

建议值:16

用法:-XX:SurvivorRatio=16

-XX:PermSize

为永久生成对象保留的堆区域存储JVM的所有反射数据。对于动态地装入和卸装大量类的应用程序来说,应该增大此大小以优化它们的性能。通过将此参数设置为128MB,可以消除增大此部分堆所需的开销。

建议值:128MB

用法:XX:PermSize=128m将perm大小设置为128兆字节。

-Xmn

此设置控制允许新生成的对象在堆中耗用的空间量。正确调整此参数有助于降低垃圾回收开销,从而缩短服务器响应时间并提高吞吐量。此参数的缺省设置通常过低,这将导致执行大量的小型垃圾回收操作。如果将此参数设置得过高,可能会导致JVM仅执行大型(全面)垃圾回收。这些垃圾回收操作通常会耗时几秒钟,这将严重影响服务器的整体性能。您必须保持将此参数设置为小于整个堆大小的一半,以避免这种情况出现。

缺省值:2228224字节

建议值:大约整个堆大小的1/4

用法:-Xmn256m将大小设置为256兆字节。

-Xnoclassgc

缺省情况下,当一个类没有任何活动实例时,JVM就会从内存中卸装该类,但是这样会使性能下降。如果关闭类垃圾回收,就可以消除由于多次装入和卸装同一个类而造成的开销。

如果不再需要某个类,那么该类在堆中所占用的空间通常将用于创建新对象。但是,如果应用程序通过创建类的新实例来处理请求,并且该应用程序的请求是随机出现的,那么可能会发生以下情况:先前请求者完成后,正常的类垃圾回收将通过释放这个类占用的堆空间来清除这个类,但当下一个请求出现时,又必须将这个类重新实例化。在这种情况下,您可能想使用此选项来禁用类垃圾回收。

缺省值:启用类垃圾回收

建议值:禁用类垃圾回收

用法:Xnoclassgc禁用类垃圾回收

有关调整SunJVM的其他信息,请参阅JavaHotSpotVM的性能文档。

调整HPJVM的垃圾回收器

HPJVM依靠分代垃圾回收来实现最佳性能。下列命令行参数对于调整垃圾回收来说非常有用。

-Xoptgc

此设置针对包含许多短生命周期对象的应用程序优化JVM。如果未指定此参数,那么JVM通常执行大型(全面)垃圾回收。全面垃圾回收会花费几秒钟时间,这将显著影响服务器性能。

缺省值:off

建议值:on

用法:-Xoptgc启用优化的垃圾回收。

-XX:SurvivorRatio

将Java堆划分为旧对象(长生命周期对象)区域和新对象区域。新对象区域进一步细分为两部分,第一部分用于分配给新对象(初始区域),第二部分存放那些经过其前几次垃圾回收之后、但在被提升为旧对象之前仍在使用中的新对象(幸存者空间)。幸存者比率是堆的新对象区域中初始区域与幸存者空间的比率。增大此设置将针对需要创建大量对象但仅保留少量对象的应用程序优化JVM。与其他应用程序相比,WebSphereApplicationServer会生成更多中等生命周期对象和长生命周期对象,因此,应该将此设置设置为小于缺省值。

缺省值:32

建议值:16

用法:-XX:SurvivorRatio=16

-XX:PermSize

为永久生成对象保留的堆区域存储JVM的所有反射数据。对于动态地装入和卸装大量类的应用程序来说,应该增大此大小以优化它们的性能。通过将此参数指定为128兆字节,可以消除增大此部分堆所需的开销。

缺省值:0

建议值:128兆字节

用法:-XX:PermSize=128m将PermSize设置为128兆字节

-XX:+ForceMmapReserved

缺省情况下,Java堆以“惰性交换”方式进行分配。在此方式下,将根据需要来分配内存页,这样可以节省交换空间,但是也将强制使用4KB页。在大型堆系统中,这种内存分配方式允许堆包含数以十万计的页。此命令禁用“惰性交换”并允许操作系统使用较大的内存页,从而优化对构成Java堆的内存的访问。

缺省值:off

建议值:on

用法:-XX:+ForceMmapReserved将禁用“惰性交换”。

-Xmn

此设置控制允许新生成的对象在堆中耗用的空间量。正确调整此参数有助于降低垃圾回收开销,从而缩短服务器响应时间并提高吞吐量。此参数的缺省设置通常过低,这将导致执行大量的小型垃圾回收操作。

缺省值:没有缺省值

建议值:大约整个堆大小的3/4

用法:-Xmn768m将大小设置为768兆字节

虚拟页大小

通过将Java虚拟机的指令页大小和数据页大小设置为64MB,可以提高性能。

缺省值:4MB

建议值:64MB

用法:使用以下命令。命令输出提供了进程可执行文件的当前操作系统特征:

chatr+pi64M+pd64M/opt/WebSphere/

AppServer/java/bin/PA_RISC2.0/

native_threads/java

-Xnoclassgc

缺省情况下,当一个类没有任何活动实例时,JVM就会从内存中卸装该类,但是这样会使性能下降。如果关闭类垃圾回收,就可以消除由于多次装入和卸装同一个类而造成的开销。

如果不再需要某个类,那么该类在堆中所占用的空间通常将用于创建新对象。但是,如果应用程序通过创建类的新实例来处理请求,并且该应用程序的请求是随机出现的,那么可能会发生以下情况:先前请求者完成后,正常的类垃圾回收将通过释放这个类占用的堆空间来清除这个类,但当下一个请求出现时,又必须将这个类重新实例化。在这种情况下,您可能想使用此选项来禁用类垃圾回收。

缺省值:启用类垃圾回收

建议值:禁用类垃圾回收

用法:Xnoclassgc禁用类垃圾回收

有关调整HP虚拟机的其他信息,请参阅Java技术软件HP-UX11i。

调整HP的JVMforHP-UX设置下列选项以提高应用程序性能:

-XX:SchedulerPriorityRange=SCHED_NOAGE

-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.DevPollSelectorProvider

-XX:-ExtraPollBeforeRead

相关推荐