JVM优化指南(通用版)

Java虚拟机(简称JVM)是在微处理器上执行Java类文件中的字节码的虚拟“执行引擎”实例。调整JVM的方式会影响WebLogic Server和您的应用程序的性能。

JVM调优参考因素表:

下表介绍了WebLogic Server的一般JVM调优考虑因素。

调优因素信息参考
JVM供应商和版本仅使用经过认证的生产JVM,这些JVM已经通过了WebLogic Server的认证。本版本的WebLogic Server仅支持符合J2SE 5.0标准的JVM。
调整堆大小和垃圾回收有关WebLogic Server堆大小调整的详细信息,请参阅垃圾回收。
选择GC方案根据您的应用程序,有多种GC方案可用于管理系统内存,如选择垃圾回收方案所述。
混合客户端/服务器JVMWebLogic Server支持使用不同的JVM版本进行客户端和服务器的部署。请参见支持页面上的混合客户端/服务器JVM部分。
UNIX线程模型您对Solaris线程模型的选择可能对Solaris上JVM的性能产生重大影响。具体情况因JVM而异。

VM堆大小和垃圾回收

  1. Java堆是Java程序中对象存放的地方。它包含了活动对象、无用对象和空闲内存。当一个对象无法从程序中的任何指针访问到时,它被认为是"垃圾"并且准备进行回收。一个最佳实践是调整垃圾回收的时间,使其在执行时间内占比不超过5%。

  2. JVM堆大小决定了垃圾回收的频率和持续时间。合适的垃圾回收频率是与应用程序相关的,并且应在分析实际垃圾回收时间和频率后进行调整。如果设置了一个较大的堆大小,完整的垃圾回收会变慢,但发生的频率较低。如果根据内存需求设置了合适的堆大小,完整的垃圾回收会更快,但发生的频率较高。

  3. 调优堆大小的目标是尽量减少JVM执行垃圾回收的时间,同时最大限度地提高WebLogic Server在给定时间内可以处理的客户端数量。为了确保在基准测试期间实现最佳性能,您可以设置较高的堆大小值,以确保垃圾回收在整个基准测试运行过程中不发生。

  4. 如果你的堆空间不足,可能会出现以下Java错误:

java.lang.OutOfMemoryError <<no stack trace available>>
java.lang.OutOfMemoryError <<no stack trace available>>
Exception in thread "main"
  1. 要修改堆空间的值,请查看本文后面的“指定堆大小值”。

  2. 要配置WebLogic Server在堆空间不足时自动检测并处理低内存条件:

WebLogic Server可以自动记录服务器观察到的低内存条件。它通过在一个时间间隔内对可用的空闲内存进行一定次数的采样来检测低内存情况。在每个时间间隔结束时,记录并将所得的平均空闲内存与下一个时间间隔得到的平均值进行比较。如果平均值在任何采样间隔后下降了用户配置的值,服务器将在日志文件中记录低内存警告信息,并将服务器健康状态设置为"警告"。详情可查询Oracle WebLogic Server管理控制台帮助

选择合适的垃圾回收方案:
不同的JVM,有不同的垃圾回收方案来管理系统内存。

例如,某些垃圾回收方案更适合特定类型的应用程序。一旦你了解了应用程序的工作负载和JVM使用的不同垃圾回收算法,就可以优化垃圾回收的配置。

你可以参考以下链接,深入讨论JVM的垃圾回收选项:
文档链接
Sun的HotSpot VM可用的垃圾回收方案概述http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
可用的收集方案的全面介绍http://wireless.java.sun.com/midp/articles/garbagecolletion2/
JRockit JDK可用的垃圾回收方案的讨论http://download.oracle.com/docs/cd/E13150_01/jrockit_jvm/jrockit/webdocs/index.html
惠普对垃圾回收的一些建议http://h21007.www2.hp.com/dspp/tech/tech_TechDocumentDetailPage_IDX/1,1701,1604,00.html

使用Verbose Garbage Collection确定堆大小

Verbose垃圾回收选项(verbosegc)可以帮助你准确测量垃圾回收所使用的时间和资源。为了确定最有效的堆大小,可以打开verbose垃圾回收,并将输出重定向到日志文件中以进行诊断。

步骤:
  1. 在运行应用程序的同时,监视WebLogic Server在最大负载下的性能。

  2. 使用-verbosegc选项为你的JVM打开verbose垃圾回收输出,并将标准错误和标准输出都重定向到日志文件中。这样可以将线程转储信息与WebLogic Server的信息和错误消息放置在正确的上下文中,并提供更有用的日志用于诊断目的。

例如,在Windows和Solaris上,输入以下命令:

java -ms32m -mx200m -verbosegc -classpath $CLASSPATH
-Dweblogic.Name=%SERVER_NAME% -Dbea.home="C:\Oracle\Middleware"
-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)。由于输出包括垃圾回收运行的时间戳,因此可以推断垃圾回收发生的频率。

分析以下数据点:

1. 垃圾回收发生的频率如何?在weblogic.log文件中,对比垃圾回收周围的时间戳。
2. 垃圾回收需要多长时间?完整的垃圾回收时间不应超过3到5秒
3. 平均内存占用是多少?换句话说,每次完整的垃圾回收后堆会恢复到什么程度?如果堆总是恢复到85%的空闲状态,可能需要减小堆大小
4. 查看新生代堆大小(Sun)或Nursery大小(Jrockit)。
5. 确保堆大小不大于系统上可用的空闲RAM。

为了避免系统将数据从内存移入硬盘交换区(即页面交换),请尽可能配置更大的堆内存大小。系统上可用的空闲RAM取决于你的计算机硬件配置和其他正在运行的程序所需的内存量。建议咨询系统管理员以确定系统上还有多少可用的空闲RAM。简而言之,需要确保不过度占用系统资源的前提下,扩大堆内存的大小以提高性能。

6. 如果发现系统在进行垃圾回收时花费了太多的时间(分配的虚拟内存超过了RAM的处理能力),可以降低堆大小。一般都应将可用RAM的80%(不包括操作系统或其他进程使用的部分)用于JVM。
7. 如果发现有大量可用的空闲RAM剩余,请在机器上运行更多的WebLogic Server实例。

此外,JVM供应商可能会提供其他选项来打印全面的垃圾回收报告。例如,你可以使用JRockit JVM的-Xgcreport选项,在程序完成时打印详细的垃圾回收报告。

特别注意:调整堆大小的目标是最大限度地减少JVM执行垃圾回收所花费时间,同时最大化WebLogic Server在给定时间内能够处理的客户端数量。

指定堆大小值

Java堆大小的值对系统性能有很大影响。本节介绍了用于定义堆大小值的命令行选项。每次启动WebLogic Server实例时必须指定Java堆大小值。可以通过java命令行或修改WebLogic发行版提供的示例启动脚本中的默认值来完成这个操作。

堆大小调优技巧

VM堆大小的一般调优原则:
  1. 堆大小应设置为使VM使用的最大内存量不超过可用物理RAM的值。如果超过此值,操作系统开始分页,性能显著下降。VM始终使用的内存比堆大小更多。除了堆大小设置外,还会为内部VM功能、VM外部的本机库和永久代内存(仅适用于Sun VM:用于存储类和方法的内存)分配额外的内存。

  2. 当使用分代垃圾回收方案时,新生代的大小不应超过总Java堆大小的一半。通常,堆大小的25%到40%是足够的。

  3. 在生产环境中,将最小堆大小和最大堆大小设置为相同的值,以防止浪费VM资源用于不断增长和缩小堆。对于新生代堆大小(Sun)或Nursery大小(Jrockit)也适用这一原则。

JRockit JVM堆大小配置的可选参数

对于不同的应用程序,我们需要根据实际情况调整JRockit的堆大小选项,以获得最好的性能表现。这些选项包括设置新生代堆空间大小、初始和最小堆大小、最大堆大小以及垃圾回收方式等。通过合理地设置这些选项,我们可以使应用程序在垃圾回收和内存利用方面达到最优的平衡,从而提高系统性能。

任务选项描述
设置新生代堆空间大小-Xns在保持垃圾回收暂停时间可接受的情况下,尽可能将新生代堆的大小设置得大一些。这对于创建大量临时对象的应用程序非常重要。新生代堆的最大大小不能超过最大堆大小的95%。
设置初始和最小堆大小-XmsOracle建议将最小堆大小(-Xms)设置为最大堆大小(-Xmx),以减少垃圾回收频次。
设置最大堆大小-Xmx如果将最大堆值设置得较低,相对于实际存活数据量,将会导致性能下降,因为需要频繁进行垃圾回收。
设置垃圾回收方式-Xgc: parallel尽早在Java应用程序运行时执行自适应优化。
在Java应用程序运行的尽早阶段执行自适应优化-XXaggressive:memory为此,瓶颈检测器会从一开始以更高的频率运行,然后逐渐降低频率。该选项还告诉JRockit要积极利用可用的内存。

举例来说,使用命令行启动WebLogic Server实例时,你可以通过以下方式指定JRockit VM的堆大小值:

java -Xns10m -Xms512m -Xmx512m

这些值的默认单位是字节:
在值后面添加字母'k'或'K'表示千字节, 'm'或'M'表示兆字节, 'g'或'G'表示千兆字节。
该例子将10兆字节的内存分配给新生代堆大小,并将512兆字节的内存分配给运行在JVM中的WebLogic Server实例的最小和最大堆大小。

其他文档链接
设置WebLogic的JRockit JVM适当堆大小的详细信息http://download.oracle.com/docs/cd/E13150_01/jrockit_jvm/jrockit/webdocs/index.html
其他JRockit VM选项http://download.oracle.com/docs/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/index.html

Java HotSpot VM堆大小配置的可选参数

任务选项注释
设置新生代堆空间大小-XX:NewSize通常情况下,将-XX:NewSize设置为堆大小的四分之一。增加此选项的值可用于处理数量较大的短生命周期对象。随着处理器数量的增加,请确保适当增加新生代堆大小。内存分配可以并行进行,但垃圾回收不能并行进行。
设置新生代堆的最大大小-XX:MaxNewSize设置新生代堆的最大大小。
设置新堆大小比例-XX:SurvivorRatio新生代区域被划分为三个子区域:伊甸园和两个大小相等的幸存者空间。配置伊甸园/幸存者空间大小比例。尝试将此值设置为8,然后监视垃圾回收情况。
设置初始堆大小-Xms通常情况下,将初始堆大小(-Xms)设置为最大堆大小(-Xmx),以减少垃圾回收次数。
设置最大堆大小-Xmx设置堆的最大大小。
设置大堆和共享内存-XX:+UseISM -XX:+AggressiveHeap请参考厂商的文档,查看针对特定平台的JVM调优选项。

例如,在使用java命令行启动WebLogic Server实例时,你可以按照以下方式指定HotSpot VM的堆大小值:

java -XX:NewSize=128m -XX:MaxNewSize=128m -Xms512m -Xmx512m

此示例将新生代堆大小设置为128兆字节,并将最小和最大堆大小都设置为512兆字节。

Java HotSpot VM还提供了其他一些命令行选项,可以用来改善VM的性能。具体如何使用这些选项取决于你的应用程序的编码方式。
为了确定哪些选项对你的应用程序性能更好,你可以对客户端和服务器的JVM进行测试。Sun Microsystems提供了有关命令行选项和环境变量的信息,这些选项和变量会影响Java HotSpot虚拟机的性能特征。

详情可参考 HotSpot VM Options

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木法星人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值