Jvm 调优,源于官方文档
1.前言
官方文档通道 >>>>>>>>>>>>《java白皮书》
**注意:**本篇文章主要起参考作用,毕竟这个官方文档修订的时间是2005年,只是提供一个方向思路。
2.调优:
2.1调优示例
下面是一些用于实验的特定调优示例。请理解,这些只是示例,硬件上应用程序的最佳堆大小和调优参数可能会有所不同。
2.2.调优示例1:吞吐量调整
下面是一个针对运行在具有4GB内存且能够同时运行32个线程(CPU和内核或上下文)的系统上的服务器应用程序的特定命令行调优示例。
java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC
-XX:ParallelGCThreads=20
-Xmx3800m -Xms3800m
配置大型Java堆以利用大型内存系统。
-Xmn2g
为年轻一代配置一个大堆(可以并行收集),再次利用大内存系统。它有助于防止短期对象过早升级到旧代,而旧代的垃圾收集成本更高。
-Xss128k
减少默认的最大线程堆栈大小,从而允许Java堆使用更多进程的虚拟内存地址空间。
-XX:+UseParallelGC
为新一代Java堆选择并行垃圾收集器(注意:这通常是默认的服务器类机器)
-XX:ParallelGCThreads=20
减少垃圾收集线程的数量。默认值等于处理器计数,在支持32个线程的系统上可能会不必要地高。
2.3.调优示例2:尝试并行旧一代收集器
与示例1类似,我们这里要测试并行旧代收集器的影响。
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC
-XX:ParallelGCThreads=20 -XX:+UseParallelOldGC
-Xmx3550m -Xms3550m
尺寸已减小。ParallelOldGC收集器有额外的本机非Java堆内存需求,因此在运行32位JVM时可能需要减少Java堆大小。
-XX:+UseParallelOldGC
使用并行旧一代收集器。旧代收集的某些阶段可以并行执行,从而加快旧代收集。
2.4.调优示例3:尝试256 MB页面
这个调优示例特定于那些支持256 MB的巨大页面大小的基于Solaris的系统。
java -Xmx2506m -Xms2506m -Xmn1536m -Xss128k -XX:+UseParallelGC
-XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:LargePageSizeInBytes=256m
-Xmx2506m -Xms2506m
大小已经减少,因为使用大页面设置会导致永久生成和代码缓存大小为256MB,这会减少Java堆的可用内存。
-Xmn1536m
年轻一代堆的大小通常是整个Java堆大小的一小部分。通常,我们建议您开始调整年轻代的大小,使其为总堆大小的1/4。在这种情况下,减少了年轻一代,以保持年轻一代和老一代规模之间的类似比率,这在前面的示例选项中使用。
-XX:LargePageSizeInBytes=256m
使Java堆(包括永久生成)和编译后的代码缓存最小使用256 MB页面(对于支持它的平台)。
2.5.调优示例4:Try-XX:AggressiveOpts
此调优示例与示例2类似,但添加了AggressiveOpts选项。
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC
-XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:+AggressiveOpts
-Xmx3550m -Xms3550m
由于我们不再使用大页面,因此大小已增加到示例2的级别。
-Xmn2g
由于我们不再使用大页面,因此大小已增加到示例2的级别。
-XX:+AggressiveOpts
启用预期在即将发布的版本中默认启用的点性能优化。按此标志分组的更改是对JVM运行时编译代码的微小更改,而不是不同的性能特性(如BiasedLocking和ParallelOldGC)。这是一个很好的标志,可以尝试JVM工程团队对即将发布的版本进行的最新性能调整。注意:此选项是实验的! 此选项启用的特定优化可以在不同版本之间更改,甚至可以在不同构建之间更改。在部署新版本的Java之前,您应该重新评估此选项的效果。
2.6.调优示例5:尝试偏置锁定
此调整示例基于示例4,并添加了“偏置锁定”选项。
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC
-XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:+AggressiveOpts -XX:+UseBiasedLocking
-XX:+UseBiasedLocking
启用一种用于提高无竞争同步性能的技术。对象“偏向”第一个通过 监控器;字节码或同步方法调用;该线程执行的后续与监视器相关的操作在多处理器机器上相对要快得多。启用此标志后,一些具有大量非竞争同步的应用程序可能会获得显著的加速;一些具有特定锁定模式的应用程序可能会出现速度减慢的情况,尽管已经尝试将负面影响降至最低。
2.7.调优示例6:针对低暂停时间和高吞吐量进行调整
这个调优示例与示例2类似,但使用了并发垃圾收集器(而不是并行吞吐量收集器)。
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=31
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC
选择并发标记扫描采集器。此收集器可以为应用程序提供更好的响应时间属性(即应用程序暂停时间较短)。它是一个并行且大多数并发的收集器,可以很好地匹配大型多处理器系统的线程能力。
-XX:SurvivorRatio=8
将幸存者空间比率设置为1:8,从而产生较大的幸存者空间(比率越小,空间越大)。较大的生存空间允许短寿命对象在年轻一代中死亡更长的时间。
-XX:TargetSurvivorRatio=90
允许90%的幸存者空间被占用,而不是默认的50%,这样可以更好地利用幸存者空间内存。
-XX:MaxTenuringThreshold=31
允许短寿命对象在年轻一代中死亡更长的时间(因此,避免升级)。此设置的结果是,由于要复制其他对象,较小的GC时间可能会增加。可能需要调整此值和幸存者空间大小,以平衡幸存者空间与寿命较长的对象之间的复制开销。CMS的默认设置为SurvivorRatio=1024和MaxTenuringThreshold=0这会使一个食腐动物的所有幸存者得到提升。这可能会给单个并发线程带来很大压力,使其无法收集持久化的生成。注:与一起使用时-XX:+UseBiasedLocking,此设置应为15
2.8.调优示例7:尝试AggressiveOpts以获得低暂停时间和高吞吐量
此调优示例基于示例6,并添加了AggressiveOpts选项。
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=31 -XX:+AggressiveOpts
-XX:+AggressiveOpts
启用预期在即将发布的版本中默认启用的点性能优化。按此标志分组的更改是对JVM运行时编译代码的微小更改,而不是不同的性能特性(如BiasedLocking和ParallelOldGC)。这是一个很好的标志,可以尝试JVM工程团队对即将发布的版本进行的最新性能调整。注意:此选项是实验的! 此选项启用的特定优化可以在不同版本之间更改,甚至可以在不同构建之间更改。在部署新版本的Java之前,您应该重新评估此选项的效果。