[AIX Solaris HP-UX Linux Windows]

Sun HotSpot Java 虚拟机调整参数(Solaris 和 HP-UX)

调节太阳HotSpotJava™ 虚拟机 (JVM) 是一个迭代过程,其中开发 JVM 配置、收集数据(主要是 verbosegc 数据),然后进行分析。 然后在下一个循环中应用配置修订。

尽管有很多 Sun HotSpot Java 虚拟机参数,但是已经将下列参数标识为调整中心。 您修改的这些参数取决于配置选项。 因此,除了查看这些参数描述之外,您还可以阅读有关调整 SunHotSpotJava 虚拟机(Solaris 和HP-UX) 以全面了解 JVM 调优方法。

这里有一张指定了所有 Sun HotSpot 选项的标准表单。 了解此表单可以帮助您避免改写选项的问题、帮助解释指示信息,并且避免潜在的由 Java 虚拟机拒绝某选项然后拒绝启动所引起的混淆。

您应该特别关注 Sun HotSpot 选项(该选项对 Sun HotSpot Java 虚拟机的实现来说是特有的),从 -XX 选项开始,而不是从标准的或便携式的虚拟机选项(如 -X option- option)开始。 大多数这些选项为布尔值,这表示它们将会设置为 true 或 false。 这些设置将启用或禁用功能部件。 下列标准表单用于启用某选项,这是您在调整过程中更改某选项的设置时通常操作的项:
-XX:+ option
下列标准表单用于禁用某选项,很少会操作此项:
-XX:- option
避免麻烦:
  • 在冒号后立即放置一个加号或减号。 否则此选项通常会需要一个值,并且此选项更像是在分配值,因为它的格式是 option=value
  • 如 SUN Web 站点上所述,在后续 JDK 发行版中对 -XX Hotspot 选项进行更改时将不会给出通知。 因此,在指定某选项之前,您应该验证一下您系统中运行的 JDK 版本是否支持此选项。

当确定选用哪个选项时,该选项的名称通常会描述(如果启用该选项)将发生的操作。 大多数选项的缺省值将会禁用此功能部件。 因此,如果您禁用某个已经禁用了某项功能部件的选项,那么可能会引起双重否定情况。 此种情况尤其可能发生在具有以单词“禁用”为开始的名称的选项上。 例如,DisableExplicitGC 选项的缺省设置将导致 Java 虚拟机优先处理“显式”垃圾回收请求。 因此,您通常会想通过指定此选项前边的加号来启用此选项。 加号将对禁用优先处理的显式垃圾回收请求产生影响,该符号为选项名称中隐藏的部分。 对于选项来说(如 DisableExplicitGC 选项),很少会遇到设置 -XX:-DisableExplicitGC,因为此设置等同于指定缺省操作。

在选项名称包含术语“使用”的情况下,该选项通常会使启用或禁用功能部件更有意义,并且通常会使加号或减号的感觉更直观。

在需要指定值的地方,就像对选项赋值一样,在选项和其设置之间会有一个等号。 在这种情况下,此选项将期望一个适当的数值来紧随在等号后面,并且在等号和数值之间无任何空格。 该值通常可以接收标准的缩写语,如代表千字节的 K、代表兆字节的 M、以及代表千兆字节的 G,它们均适合于指定这些值。 虚拟机仅执行这些参数的有限验证,同时,无效的参数通常会产生指示该虚拟机无法启动的错误消息。

-Xmx(最大的 Java 堆大小)

将此参数与 -XX:MaxPermSize 参数结合起来进行调整,以提供足够的 Java 堆内存。 当您为 Java 堆中的对象存储的最大 Java 堆大小指定值时,应该考虑必须处理峰值输入量(设计为由系统处理的)的峰值资源需求。

相比之下,使用 -Xms 参数所指定的最小的 Java 堆初始大小, 应该反映 Java 堆的大小,该 Java 堆必须能够容纳处于例行稳态输入负载下的正常系统运行所产生的持久数据。 这样的资源请求可确保高效的系统启动,其中仅要求正确数量的存储以允许快速初始化,而无需许多垃圾收集周期来增加堆容量。 因此,已知用于容纳例行稳态工作负载的常规容量和系统设计的峰值容量的 Java 堆的工作容量是不同的,堆容量中的任何变化都将反映系统输入中的更改,如活动的激增或工作负载的增加。

Java 堆的工作大小容量应考虑系统的运行状态的有用信息。 调整 Java 堆的最小的初始大小仅涉及优化系统启动。 将堆大小的最小值和最大值设置为同一值可固定 Java 堆,并且将约束 Java 虚拟机的恢复选项以实现其 Java 堆的内务处理。 这种类型的设置可能造成性能损失以及较差的 Java 堆资源利用率。

-XX:+AggressiveHeap

如果要通过启用的内置调整来使用缺省吞吐量/并行 scavenge 收集器,请使用此参数。 Java 虚拟机可以根据使用正在运行的操作系统上的所有资源来尝试调整其调整算法的参数。 在使用操作系统的所有资源来执行单一产品过程的情况下,如果 Java 虚拟机可以传递满意结果,那么使用此选项来确定。 在测试 Java 虚拟机结果时使用此选项会降低调整效果。

-XX:CMSInitiatingOccupancyFraction=75

如果您要使用暂停时间优先的标记清除并发收集器,请配置此参数。 此选项用于控制 CMS。 当专用的后台线程致力于在堆的永久性区域上管理垃圾回收时,将设置触发条件。 与其他的垃圾回收方式不同,此垃圾回收操作不会等到某分配失败。 相反,此目标是要在出现分配之前(如果在分配后,操作将失败),触发垃圾回收以恢复足够的空间。 原理触发器是基于 Java 堆的利用百分比,并且缺省值约为 70%。 缺省值通常会确保 CMS 循环能够充分启动,尽管此频率可能高于必要频率。

但是,在仅有非常小的原始区域并且无剩余空间可用的情况下,对象没有任何老化的机会, 这样的话,分代垃圾回收支持可以收集短生命周期对象。 对于从分代垃圾回收中受益的系统来说,通过生产很多很短生命周期对象,CMS 缺省值否定了开发主要为 Sun HotSpot 结构设计的分代支持的可能。 仅对于在新的生成剩余空间以及适当的原始区域中的资源的适度投入,要重新启用完整的分代垃圾回收操作将很可能只造成一秒钟或更少的侵入性暂停,并保持将老化的对象提升至低的永久性区域中。 在该条件下,您可以在对象老化的同时完全受益于剩余内容的自由压缩,这同时也为 CMS 线程收集永久性区域(甚至使用较大的堆)提供了最好的机会。

-XX:+DisableExplicitGC

此选项将禁用显式垃圾回收以消除可能引入到系统软件组件中的不必要的或不合时机的主要垃圾回收循环。

推荐开发者避免使用 System.gc() 调用以免造成程序员发起的、充分的压缩垃圾回收循环,因为这种调用可能干扰对整个应用程序系统的资源和垃圾回收的调整。 如果您正在努力满足要求暂停时间的需求,并且想防止程序员发起的垃圾回收调用,那么使用此选项时必须慎重考虑,因为此选项将造成显式 System.gc() 调用被忽略。

-XX:MaxNewSize= 和 -XX:NewSize=

如果您正在使用缺省吞吐量/并行 scavenge 收集器,请使用这些参数,但是如果已经决定手动调整此 scavenge 收集器,请改用 -XX:+UseAdaptiveSizePolicy 参数提供的内置调整。 当前新的生成大小被绑定为大于等于初始的或最小的新的生成大小,如 -XX:NewSize 参数上所指定的那样。 此大小小于等于为最大的新的生成所指定的值,如 -XX:MaxNewSize 参数上所指定的那样。

某些情况下可能会建议您约束堆的数量(这是分代垃圾回收需要考虑的),如 -XX:NewRatio 参数所确定的那样,通常会限制新的生成的最大大小,并且偶尔还会限制其最小大小。 例如,设置大的对象的极限可能会受限于分代垃圾回收,或将限制内存的最大数量(通常在使用具有长生存周期的持久对象的集合中),因此您可能会需要设置新的生成堆的最大大小。 为用于新生代对象的堆的部分指定最小大小,通常伴随对于剩余空间使用量的调整,但该操作通常并不是很重要,但是必须满足 Java 堆中最小资源的约束,如 -Xms 参数所指定。

除非您要在分代垃圾回收内寻求特定的行为,否则不必从 NewRatio 选项的使用中分别指定最大大小或最小大小。 通常情况下,设置最大值或最小值的原因不同。 这些设置很少会需要设置为相同的值,甚至存在使用 -Xmn 参数来设置并固定新的生成部分的大小的捷径。 但是,配置不当将有可能失去整个分代垃圾回收的益处。

-XX:MaxPermSize(永久区域)

以具有 -Xmx 参数的合取方式来调整此参数,以提供足够的 Java 堆内存。 永久区域用于存储所有的类和似类的数据,如保留的字符串。

永久区域必须足够大才能调解可能并发地加载在一起的所有类。 为此区域确定适当的大小可能比较麻烦,因为此堆的区域较小,扩张较慢,并且特殊用于似类的对象,常规观察得出其当前容量利用率在 99% 到 100% 之间。 因此,您必须小心以免发生内存不足的状况。 您应在为此区域提供更多资源前,经常验证此区域是否被最大程度的扩张。

避免麻烦:在任何Java Platform, Enterprise Edition( Java EE ) 系统,由于大量使用应用程序类加载器,因此应避免使用-Xnoclassgc参数,因为该参数会阻止对堆的这个关键区域进行垃圾收集,从而有效地造成类数据的内存泄漏。 对于要频繁部署更改类内容的开发系统,您应该为此区域特别设置超大范围的值。 您还应该定期地重新启动此系统以防止休眠代码的旧版本调解当前使用的版本,否则类装入器将不可发行。

-XX:最大阈值=收集次数

在使用暂停时间优先的标记清除并发收集器时配置此参数。 此参数将通过指定收集的数量来控制对象从新的生成部分向旧生成部分提升,在此期间,在移动至旧生成部分之前,对象将保留在新的生成部分中。 缺省值为 8。

-XX:NewRatio=2

如果您正在使用缺省吞吐量/并行 scavenge 收集器,请使用此参数,但是如果已经决定手动调整此 scavenge 收集器,请改用 -XX:+UseAdaptiveSizePolicy 参数提供的内置调整。

Java 堆分为用于存储对象的两部分。 一部分会发生分代垃圾回收,并且会驻留新的生成对象。 另一部分由堆的余下部分组成,被称为养老堆,同时驻留旧的或生命周期长的对象。 此选项对支持分代垃圾回收的新的生成区域设置大小,其大小与总体堆容量相称。 当前新的生成大小被绑定为大于等于初始的或最小的新的生成大小,如 -XX:NewSize 参数上所指定的那样。 此大小小于等于为最大新的生成所指定的值,如 -XX:MaxNewSize 参数上所指定的那样。 新生代大小将保持为相对于永久性区域的比率,由主 Java 堆的当前容量确定。 缺省值 2 意味着养老区域的大小为新生代区域的大小的 2 倍,也就意味着新生代区域的大小为整个 Java 堆的三分之一。

此缺省值通常传递良好的分代垃圾回收性能,为调整 Sun HotSpot Java 虚拟机的典型目标。 但是存在其他策略。 例如,您可能想增加处理分代垃圾回收的堆的比例。 如果您决定更改此比例,那么要记住存在一个可以由分代垃圾回收适当地保持的多少个堆的极限,如果超出该极限,那么所有分代垃圾回收可能会丢失,因为考虑到次要的垃圾回收仅为堆的生成部分,所以垃圾回收循环将会取代期望的次要的垃圾回收循环而变成主要的垃圾回收循环,进而覆盖整个堆。

2 为以虚拟机方式运行的服务器的缺省值。

-XX:NewSize=128m

如果您要使用暂停时间优先的标记清除并发收集器,请配置此参数。 当前新的生成大小被绑定为大于等于初始的或最小的新的生成大小,如 -XX:NewSize 参数上所指定的那样。 调整 CMS 的困难之一是,最差状况的垃圾回收次数(发生在 CMS 终止时)可能会花费几秒钟的时间,特别是在采用 CMS 为避免长时间暂停的方式系统中。

因此,服务级别协议可以规定 CMS 的用法。 此种情况下,调整必须极度谨慎以确保 CMS 有更多的成功机会。 只有当预期的触发器确保 CMS 循环尽早启动以确保在需要自由资源之前总是存在足够的可用的自由资源时,CMS 才能成功。 如果 CMS 收集器不能在填满养老生成之前完成,那么收集将通过暂停应用程序线程来完成,此操作称为完整收集。 完整收集是 CMS 收集器需求进一步调整以使其操作更适合应用程序的一个标志。

-XX:SurvivorRatio=

如果您正在使用缺省吞吐量/并行 scavenge 收集器,请使用此参数,但是如果已经决定手动调整此 scavenge 收集器,或者如果您正在尝试调整并发的以暂停优先的收集器,请改用 -XX:+UseAdaptiveSizePolicy 参数提供的内置调整。

分代垃圾回收操作涉及到将长生命周期对象分离成短生命周期对象。 只有这些继续在使用中的对象才需要在堆中保存。 主导分代垃圾回收的新生成区域包含深层的内部结构。 它包含一个最初分配对象的大的原始区域,和较小的剩余空间(该剩余空间驻留具有长生存期的对象)。 SurvivorRatio 根据大的原始区域如何与较小的剩余空间相关联来为这些区域设置大小。 设置剩余空间大小通常是次要的,因为可能从优化中受益的对象的量通过应用程序将较大地改变。 但是,通常您应该将该值从默认值 25 减少到 8 左右。

对此参数的任何更改均应通过对涉及调整的数据的分析进行验证。 您可以使用 -XX:+PrintTenuringDistribution 参数来获取此数据

避免麻烦:-XX:SurvivorRatio=选项与 JVM 参数不兼容-XX:+UseAdaptiveSizePolicy。 因此请根据您的情况使用其中某一个值。

-XX:TargetSurvivorRatio=

如果您正在使用缺省吞吐量/并行 scavenge 收集器,请使用此参数,但是如果已经决定手动调整此 scavenge 收集器,请改用 -XX:+UseAdaptiveSizePolicy 参数提供的内置调整。

此参数支持 Java 虚拟机增加剩余空间的利用百分比,因此要避免过早的提升,如果可能,还应该使从新生成中收集的对象最大化。 缺省值为 50。 如果将此参数设置为 90,那么可以更好地利用这些区域。

-XX:+UseAdaptiveSizePolicy

使用此参数来启用对缺省吞吐量/并行 scavenge 收集器的内置调整。

除自动操作系统指南外,Sun 还包含一个调整算法,该算法尝试自动地调整 Java 虚拟机以优化吞吐量目标和吞吐量收集策略的效率。 此调整算法通过缺省来发动,并且使用 -XX:+UseAdaptiveSizePolicy 参数显式地参与。 对于大多数的应用程序工作负载来讲,此调整算法通常会获得满意的结果,使您无需再执行额外的调整。 但是您应该继续对工作负载的此算法进行测试,并且应该在将其用于生产环境之前验证它是否符合吞吐量的要求。

-XX:+UseConcMarkSweepGC

使用此参数来启用暂停时间优先的标记清除并发收集器。 此垃圾回收方式将重新配置分代垃圾回收,以便开箱即用系统将必须收集新生成内容所引入的侵入式暂停最小化。

此参数还将新的生成程度或原始区域最小化。 虽然仅存在有限的可用工作量,但服务器类系统通常会(尝试以并行方式收集新的生成)在完全传递最小的暂停可能的尝试中,它将检测多个处理器的可用性,同时也降低了协调开销之后使用多线程的优势。 相对于吞吐量收集器设置,为了不再通过分代垃圾回收将工作移位,通常会需要将已落实到主要堆上的资源增加为百分之三十左右。

-XX:+UseParallelGC

使用此参数来启用缺省吞吐量/并行 scavenge 收集器。

服务器 Java 虚拟机的缺省垃圾回收方式将采用吞吐量收集器,该处理器以并行方式处理新的生成中的次要的垃圾回收(如前台停止所有线程的任务)。 可以通过使用 -XX:+UseParallelGC 参数来显式地启用此收集器。 除吞吐量外,可指定目标。 但是,未达到此目标的惩罚可能会非常严重,并且可能会造成内存不足的致命错误。