如何改善系统对JVM的使用方式

应用程序服务器是一个 Java 进程,它需要 Java 虚拟机(JVM)才能运行以及支持它所运行的 Java 应用程序。在配置应用程序服务器的过程中,可以对设置进行微调以改善系统对 JVM 的使用方式。

  关于本任务

  JVM 为基于 Java 的应用程序提供了运行时执行环境。WebSphere Application Server 是 JVM 运行时环境与基于 Java 的服务器运行时的组合。它可以在不同 JVM 提供程序提供的 JVM 上运行。要确定正在运行 Application Server 的 JVM 的提供程序,请从 WebSphere Application Server 的app_server_root/java/bin 目录中发出 java -fullversion 命令。您也可以检查其中一个服务器的 SystemOut.log。当应用程序服务器启动时,Websphere Application Server 会将关于 JVM 的信息(包括 JVM 提供程序信息)写入此日志文件。

  从调整 JVM 的观点看,有两种主要的 JVM 类型:

  IBM JVM

  基于 Sun HotSpot 的 JVM,其中包括 Solaris 上的 Sun HotSpot JVM 以及 HP 的 JVM for HP-UX

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

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

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

  类装入调整。

  过程

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

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

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

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

  -Xquickstart

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

  缺省值:

  高初始编译器优化级别

  建议值:

  高初始编译器优化级别

  用法:

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

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

  -server

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

  缺省值:

  简单编译器

  建议值:

  能够执行优化的编译器

  用法:

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

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

  -Xms

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

  缺省值:

  256 MB

  建议值:

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

  用法:

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

  -Xmx

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

  缺省值:

  512 MB

  建议值:

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

  用法:

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

  -Xlp

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

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

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

  调整 IBM JVM 的垃圾回收器。

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

  -Xgcpolicy

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

  缺省值:

  optthruput

  建议值:

  optthruput

  用法:

  Xgcpolicy:optthruput

  -Xnoclassgc

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

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

  缺省值:

  启用类垃圾回收

  建议值:

  禁用类垃圾回收

  用法:

  Xnoclassgc 禁用类垃圾回收

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

  http://www.ibm.com/developerworks/java/
  调整 Sun JVM 的垃圾回收器

  在 Solaris 平台上,WebSphere Application Server 在 Sun Hotspot JVM 上运行,而不是在 IBM JVM 上运行。对 Sun JVM 使用正确的调整参数以利用其性能优化功能十分重要。

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

  -XX:SurvivorRatio

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

  缺省值:

  32

  建议值:

  16

  用法:

  -XX:SurvivorRatio=16

  -XX:PermSize

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

  建议值:

  128 MB

  用法:

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

  -Xmn

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

  缺省值:

  2228224 字节

  建议值:

  大约整个堆大小的 1/4

  用法:

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

  -Xnoclassgc

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

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

  缺省值:

  启用类垃圾回收

  建议值:

  禁用类垃圾回收

  用法:

  Xnoclassgc 禁用类垃圾回收

  有关调整 Sun JVM 的其他信息,请参阅 Java HotSpot VM 的性能文档。

  调整 HP JVM 的垃圾回收器

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

  -Xoptgc

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

  缺省值:

  off

  建议值:

  on

  用法:

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

  -XX:SurvivorRatio

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

  缺省值:

  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-UX 11i。

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

  -XX:SchedulerPriorityRange=SCHED_NOAGE

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

  -XX:-ExtraPollBeforeRead

添加新评论