WebLogic Server 性能及调整
Java 虚拟机(Java virtual machine,简称 JVM)是一种虚拟“执行引擎”实例,可在微处理器上执行 Java 类文件中的字节码。调整 JVM 的方式会影响 WebLogic Server 和应用程序的性能。
下列部分讨论的是 WebLogic Server 的 JVM 调整选项:
JVM 调整注意事项
表 5-1 列出了针对 WebLogic Server 的 JVM 调整的一般注意事项:
| |
| |
| |
| |
|
哪种 JVM 适合您的系统?
虽然本部分着重介绍 Sun Microsystems 用于 Windows、UNIX 和 Linux 平台的 J2SE 5.0 JVM,但请注意 BEA JRockit JVM 是明确为服务器端应用程序开发的,并针对 Intel 体系结构进行了优化,可以确保 Java 应用程序的可靠性、可伸缩性、可管理性和灵活性。有关在 Windows 和 Linux 平台上使用 JRockit 的优势的详细信息,请参阅 Introduction to JRockit JDK。
有关 JVM 的常规详细信息,请参阅 JVM 规范简介。有关 JVM 调整相关内容的链接,请参阅相关内容:性能工具和信息。
更换到另一个 JVM
创建域时,如果选择自定义配置,则配置向导会显示 WebLogic Server 安装的 JDK 列表。在此列表中,您可以选择希望运行域的 JVM,然后 Configuration Wizard 将根据您的选择配置 BEA 启动脚本。如果在创建域之后,想要使用另一 JVM,请参阅更改运行服务器的 JVM。
垃圾收集
垃圾收集是 VM 释放 Java 堆中未使用的 Java 对象的过程。下列部分提供有关调整 VM 垃圾收集的信息:
VM 堆大小和垃圾收集
Java 程序对象存储在 Java 堆中。Java 堆是包括活动对象、无效对象及可用内存的仓库。如果某对象不再能够在运行的程序中通过任何指针进行访问,则会将该对象视为“垃圾”,可以进行收集。将进行垃圾收集所耗费的时间调整为执行时间的 5% 以下,这是一种最佳实践。
JVM 堆大小决定 VM 收集垃圾的频率及所耗费的时间。可以接受的垃圾收集速率因应用程序而异,并且应在分析垃圾收集的实际时间和频率后进行调整。如果将堆大小设置得很大,则执行完全垃圾收集的速度将会较慢,但收集频率会较低。如果根据内存需求设置堆大小,则完全垃圾收集的速度会较快,但收集频率会较高。
调整堆大小的目的是将 JVM 进行垃圾收集所耗费的时间缩到最短,同时将 WebLogic Server 在某给定时间内可以处理的客户端数增至最大。要确保在基准测试期间得到最佳性能,可将堆大小值设置得很大,以确保不会在整个基准测试过程中进行垃圾收集。
java.lang.OutOfMemoryError <> java.lang.OutOfMemoryError <> Exception in thread "main"
要修改堆空间值,请参阅指定堆大小值。
要配置 WebLogic Server 以便在堆空间用尽时自动进行检测,以及处理服务器中内存不足的情况,请参阅自动对内存不足情况进行日志记录和指定堆大小值。
选择垃圾收集方案
可从若干垃圾收集方案中进行选择,以管理系统内存,所选择的方案取决于所使用的 JVM。例如,某些垃圾收集方案更适用于给定类型的应用程序。了解应用程序的工作负荷以及 JVM 所用的各种垃圾收集算法之后,就可以优化垃圾收集的配置。
有关 Sun 的 HotSpot VM 可用的垃圾收集方案的概述,请参阅 Tuning Garbage Collection with the 5.0 Java Virtual Machine。有关可用收集方案的详尽说明,请参阅 Improving Java Application Performance and Scalability by Reducing Garbage Collection Times and Sizing Memory Using JDK 1.4.1。有关 BEA JRockit JDK 可用的垃圾收集方案的讨论,请参阅。对于从 HP 视角来看有关垃圾收集的某些观点,请参阅 。
使用详细垃圾收集确定堆大小
通过详细垃圾收集选项 (verbosegc
),能够精确测量向垃圾收集投入了多少时间和资源。要确定最有效的堆大小,请启用详细垃圾收集,然后将其输出重定向到日志文件,以便进行诊断。
在运行应用程序时监视 WebLogic Server 在最大负载下的性能。用-verbosegc
选项对 JVM 启用详细垃圾收集输出,然后将标准错误和标准输出都重定向到日志文件。这会将线程转储信息存储到相应的 WebLogic Server 信息性消息和错误消息上下文中,从而提供更有用的日志以便进行诊断。例如,在 Windows 和 Solaris 中,输入下列代码:% java -ms32m -mx200m -verbosegc -classpath $CLASSPATH -Dweblogic.Name=%SERVER_NAME% -Dbea.home="C:\bea" -Dweblogic.management.username=%WLS_USER% -Dweblogic.management.password=%WLS_PW% -Dweblogic.management.server=%ADMIN_URL% -Dweblogic.ProductionModeEnabled=%STARTMODE% -Djava.security.policy="%WL_HOME%\server\lib\weblogic.policy" weblogic.Server >> logfile.txt 2>&1
其中的logfile.txt 2>&1
命令可将标准错误和标准输出都重定向到日志文件。在 HPUX 中,可使用以下选项将stderr
stdout
重定向到单个文件:-Xverbosegc:file=/tmp/gc$$.out
其中$$
可以映射到 Java 进程的进程 ID (PID)。因为输出中包括运行垃圾收集时的时间戳,所以可推断出进行垃圾收集的频率。分析下列数据点:检查新一代堆大小 (Sun) 或 Nursery 大小 (BEA Jrockit)。
对于 BEA Jrockit:请参阅 BEA JRockit JVM 堆大小选项。对于 Sun:请参阅 Java HotSpot VM 堆大小选项。
注意: | JVM 供应商可能会提供用于打印详尽的垃圾收集报告的其他选项。例如,可在关闭程序时使用 BEA JRockit JVM -Xgcreport 选项打印详尽的垃圾收集报告,请参阅。 |
指定堆大小值
可供 JVM 使用的 Java 堆大小对系统性能具有较大影响。本部分介绍用于定义堆大小值的命令行选项。每当启动 WebLogic Server 实例时,均需指定 Java 堆大小值。在 java
命令行中,或通过修改随 WebLogic 分发提供的示例启动脚本(用于启动 WebLogic Server)中的默认值,均可执行上述操作。
堆大小调整提示
堆大小应设置为一个适当的值,从而使 VM 使用的最大内存量不超过可用物理 RAM 量。如果超过该值,则 OS 会开始分页,性能也会显著降低。VM 使用的内存始终多于堆大小。除了堆大小设置,还要分配内部 VM 功能、VM 之外的本地库和永久代内存(仅适用于 Sun VM:存储类和方法所需的内存)所需的内存。使用分代式垃圾收集方案时,Nursery 大小不应超过 Java 堆总大小的一半。通常情况下,堆大小的 25% 到 40% 就已足够。在生产环境中,将最小堆大小和最大堆大小设置为同一值,可以避免浪费用于时常调整堆大小所需的 VM 资源。这也适用于新一代堆大小 (Sun) 或 Nursery 大小 (BEA Jrockit)。
BEA JRockit JVM 堆大小选项
虽然 BEA JRockit 可以自动进行试探性堆大小调整,但这并不是所有应用程序的最佳选择。大多数情况下,最佳性能是通过调整每种应用程序的 VM 实现的,方法是调整表 5-2 中所示的堆大小选项。
例如,从 java
命令行启动 WebLogic Server 实例时,可使用以下命令指定 BEA JRockit VM 堆大小值:
$ java -Xns10m -Xms512m -Xmx512m
这些值的默认大小的度量单位是字节。该值后附加字母“k”或“K”表示 KB;附加“m”或“M”表示 MB;附加“g”或“G”表示 GB。上例将 10 MB 内存分配给 Nursery 堆大小,将 512 MB 内存分配给运行在 JVM 中的 WebLogic Server 实例的最小和最大堆大小。
有关针对 WebLogic 的 JRockit JVM 设置适当的堆大小的详细信息,请参阅 Tuning the JRockit JVM。
BEA 提供可以提高 BEA JRockit VM 性能的其他命令行选项。有关详细信息,请参阅 。
Java HotSpot VM 堆大小选项
通过分别调整每个应用程序,可以实现最佳性能。但是,在启动 WebLogic Server 时配置表 5-3 中列出的 Java HotSpot VM 堆大小选项,可以提高大多数应用程序的性能。
这些选项因体系结构和操作系统而异。有关平台特定的 JVM 调整选项,请参阅供应商提供的文档。
例如,从 java
命令行启动 WebLogic Server 实例时,可使用以下命令指定 HotSpot VM 堆大小值:
$ java -XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=8 -Xms512m -Xmx512m
这些值的默认大小的度量单位是字节。该值后附加字母“k”或“K”表示 KB;附加“m”或“M”表示 MB;附加“g”或“G”表示 GB。上例将 128 MB 内存分配给新一代堆大小和最大新一代堆大小,将 512 MB 内存分配给运行在 JVM 中的 WebLogic Server 实例的最小和最大堆大小。
其他 Java HotSpot VM 选项
Sun 提供了可以提高 VM 性能的其他标准和非标准命令行选项。使用这些选项的方式取决于应用程序的编码方式。
对客户端和服务器 JVM 进行测试,以确定更适用于特定应用程序的选项。Sun Microsystems 的 Java HotSpot VM Options 文档提供有关可以影响 Java HotSpot 虚拟机性能特征的命令行选项和环境变量的信息。
Sun Microsystems 的 Java Virtual Machine 文档详细论述了 J2SE 5.0 Java 虚拟机的客户端和服务器实现。
自动对内存不足情况进行日志记录
通过 WebLogic Server 能够自动记录由服务器检测到的内存不足情况。WebLogic Server 通过在某段时间间隔内对可用内存进行一定次数的采样,来检测内存不足。在每个时间间隔结束时,服务器都会记录平均可用内存,并将其与下一时间间隔中获得的平均可用内存相比较。如果在每个采样时间间隔过后,平均值的下降幅度都达到了用户配置的内存量,则服务器会在日志文件中记录内存不足的警告消息,并将服务器的运行状态设置为“警告”。请参阅“管理控制台联机帮助”中的 记录内存不足情况。
手工请求垃圾收集
您可能会发现有必要从管理控制台中手工请求完全垃圾收集。执行此操作时请记住,垃圾收集的开销很大,因为 JVM 常常检查堆中的所有活动对象。请参阅“管理控制台联机帮助”中的手工请求垃圾收集。
请求线程堆栈
您可能会发现有必要在调整应用程序时显示线程堆栈。请参阅“管理控制台联机帮助”中的显示线程堆栈。
对 IA32 平台启用旋转功能
如果在多处理器系统中运行的是锁定争用激烈的大负载应用程序,则可尝试通过使用旋转功能提升性能。通过此选项能够在进入休眠状态前对锁进行短时旋转。
Sun JDK
Sun 已针对 Windows IA32 平台,对 JDK 5.0 中的默认锁旋转行为进行了更改。对于 JDK 5.0 版,默认情况下锁旋转处于禁用状态。对于此版本,BEA 已明确地在用于启动 WebLogic Server 的环境脚本中启用了旋转功能。要启用旋转功能,请使用以下 VM 选项:
-XX:+UseSpinning
BEA JRockit
BEA JRockit VM 可以自动针对各种锁调整旋转功能,从而无须设置此参数。
注意: | 在 BEA JRockit 8.1 SDK 版中,旋转功能是通过设置 -XXenablefatspin 选项进行调整的。 |