`
huangxx
  • 浏览: 322712 次
  • 来自: ...
社区版块
存档分类
最新评论

调整 Java 虚拟机 - zt

阅读更多

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/tprf_tunejvm.html

调整 Java 虚拟机

应用程序服务器是一个 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 文章:
  • [Solaris] 调整 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-UX] 调整 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-UX] 调整 HP 的 JVM for HP-UX 设置下列选项以提高应用程序性能:
    -XX:SchedulerPriorityRange=SCHED_NOAGE 
    -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.DevPollSelectorProvider 
    -XX:-ExtraPollBeforeRead
    

下一步做什么?

请参阅Java 内存调整技巧 以了解其他调整信息。

分享到:
评论

相关推荐

    揭秘Java虚拟机-JVM设计原理与实现

    《揭秘Java虚拟机-JVM设计原理与实现》这本书深入探讨了Java虚拟机(JVM)的工作原理及其在Java编程中的核心地位。Java虚拟机是Java平台的核心组成部分,它负责执行字节码,为开发者提供了跨平台的运行环境。以下是...

    Java虚拟机----类的加载过程.docx

    Java虚拟机(JVM)的类加载过程是Java程序运行的基础,它涉及到类加载器、类的生命周期和一系列复杂的步骤。在这个过程中,类加载器主要任务是根据类的全限定名加载二进制字节流并转化为`java.lang.Class`对象。整个...

    深入理解Java虚拟机--类加载及执行子系统的案例与实战xmind文件

    深入理解Java虚拟机--类加载及执行子系统的案例与实战xmind文件

    深入Java虚拟机-周志明

    这是对学习Java虚拟机的很好的入门书。虚拟机的书很少,除了规范之外,就很少见了。

    深入理解 Java 虚拟机 - v1.0.pdf

    虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种...Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

    22 深入拆解 Java 虚拟机-20200406T052847Z-001.zip

    Java虚拟机(JVM)是Java程序运行的核心组件,它为Java代码提供了跨平台的运行环境。深入理解JVM的工作原理对于优化Java程序性能、排查问题以及提升开发能力至关重要。以下将详细介绍JVM的主要组成部分、内存模型、...

    深入java虚拟机-曹晓钢版

    最早的一个研究jvm的书籍,曹晓钢的版本。可以对照周志明的一起研究!

    Java虚拟机规范 Java SE 8版-带目录-pdf

    Java虚拟机规范 Java SE 8版-带目录-pdf,本书完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析...

    深入java虚拟机-第二版.rar

    《深入Java虚拟机》第二版是一本深受Java开发者喜爱的经典著作,它详尽地解析了Java虚拟机(JVM)的工作原理,涵盖了JVM的重要概念、设计与实现,以及优化策略。这本书对于理解Java程序的运行机制、提升性能调优能力...

    深入Java虚拟机--2积分

    本书详细地介绍了java体系结构极其内部细节,了解这些内容才能更快速的编写高效的程序

    深入java虚拟机 中文版 pdf

    《深入Java虚拟机》这本书是IT领域中关于Java虚拟机(JVM)的深度解析之作,主要聚焦于JVM的工作原理、内部结构以及优化技巧。Java虚拟机作为Java语言的核心组件,其性能直接影响到Java应用程序的运行效率。因此,对...

    MAC虚拟机-升级-加载开发者设备-获取证书-XCode-Delphi XE10安装破解-网络环境配置详解

    网络上没有一篇文章是如此详细描述了安装MAC虚拟机到Delphi XE进行IOS开发的 MAC虚拟机安装 ----> MAC系统升级 ---->VMWare Tools安装 ---->获取证书 ---->加载开发者设备 ---->下载安装XCode ---->Delphi XE...

    深入java虚拟机.pdf

    深入 Java 虚拟机.pdf Java 虚拟机(Java Virtual Machine,JVM)是 Java 语言的 runtime 环境,是 Java 程序执行的核心组件。它提供了一个平台无关的环境,允许 Java 程序在不同的操作系统和硬件平台上运行。 一...

    深入理解Java虚拟机-虚拟机类加载机制.xmind

    虚拟机把描述类的数据从Class文件中加载到内存,并对数据进行校验、转换解析和初始化,最终形成可被虚拟机直接使用的Java类型,这就是虚拟机加载机制。

    Java虚拟机规范.Java SE 8版.zip

    《Java核心技术系列:Java虚拟机规范(Java SE 8版)》由Oracle官方发布,Java虚拟机技术创建人撰写,国内资深Java技术专家翻译。书中基于全新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和...

    Java虚拟机规范-(Java SE 8版)

    Java虚拟机规范-(Java SE 8版) Java虚拟机规范-(Java SE 8版) Java虚拟机规范-(Java SE 8版)

    Java虚拟机规范(Java SE 7).pdf

    《Java虚拟机规范(Java SE 7)》是Java开发者深入理解Java运行机制的重要参考资料,它详细阐述了Java虚拟机(JVM)的工作原理和内存管理机制,为开发者提供了宝贵的洞察力,帮助他们优化程序性能,理解和解决运行时...

    理解虚拟机--有笔记版

    本文主要关注的是Java虚拟机(JVM),它是实现Java语言跨平台特性的关键。JVM定义了Java程序运行所需的一套指令集和一个相应的运行时环境。它能够将Java源代码编译成与平台无关的字节码,然后在不同的操作系统上通过...

Global site tag (gtag.js) - Google Analytics