有用的几个JVM参数
上一篇 / 下一篇 2010-11-23 21:21:01 / 个人分类:其它
JVM是多数开发人员视为理所当然的Java功能和性能背后的重负荷机器,然而,我们很少有人能理解JVM是如何进行工作的—像任务分配和垃圾收集、转动线程、打开和关闭文件、中断和/或JIT编译Java字节码,等等。51Testing软件测试网YTuh*T#|t
9I$] p:m$e0 不熟悉JVM将不仅会影响应用程序性能,而且当JVM出问题时,尝试修复也会很困难。51Testing软件测试网#p3~q^4gr
51Testing软件测试网 K%iVAQ(ZJ)ACV本文将介绍一些命令行标志,您可以使用它们来诊断和调优您的Java虚拟机性能。51Testing软件测试网^ HJv,W4OG
51Testing软件测试网:O2lgkVK~c}&Mc@1.DisableExplicitGC
},T(Z2C%ia'b6}qY051Testing软件测试网;u[F3U X我已记不清有多少次用户要求我就应用程序性能问题提供咨询了,其实只要跨代码快速运行grep,就会发现清单1所示的问题—原始Java性能反模式:
5|2`'p&yR0TJDHd I%~m4}^0 清单 1. System.gc();51Testing软件测试网cD!c!A+\K_
// We just released a bunch of objects, so tell the stupid Z4@_6h4_&fC0// garbage collector to collect them already! Vc$~"B+Q@0System.gc(); |
`%] GQf0 显式垃圾收集是一个非常糟糕的主意——就像将您和一个疯狂的斗牛犬锁在一个电话亭里。尽管调用的语法是依赖实现的,但如果您的JVM正在运行一个分代的 垃圾回收器(大多数是)System.gc();强迫VM执行一个堆的“全部清扫”,虽然有的没有必要。全部清扫比一个常规GC操作要昂贵好几个数量级, 这只是个简单数学问题。
\'Co ttF051Testing软件测试网,tb];N!Eo+]您可以不把我的话放在心上—Sun的工程师为这个特殊的人工错误提供一个JVM标 志;-XX:+DisableExplicitGC标志自动将System.gc()调用转换成一个空操作,为您提供运行代码的机会,您自己看看 System.gc()对于整个JVM执行有害还是有利。51Testing软件测试网 qO:]K`NtT
51Testing软件测试网f]*y Z'@$g/Wwc2.HeapDumpOnOutOfMemoryError
yxk)R"se051Testing软件测试网M{c1aS1Lv您有没有经历过这样的情况:JVM不能使用,不断抛出OutOfMemoryError,而您又不能为自己创建调试器来捕获它或查看出现了什么问题?像这类偶发和/或不确定的问题,通常使开发人员发疯。51Testing软件测试网WliOy2O
51Testing软件测试网L2E3R)pE9@T?买者自负
].q;B$Nge~HV051Testing软件测试网 |p;l@:goW5j并不是任何VM都支持所有命令行标志,Sun/Oracle的VM除外。查明一个标志是否被支持的最好方法是试用它,看它是否正常工作。倘若这些标志在 技术上是不支持的,那么,使用它们您要承担全部责任。如果这些标志中的任何一个使您的代码、您的数据、您的服务器或您的一切消失得无影无踪,我、 Sun/Oracle和IBM都将不负责任。为以防万一,建议先在虚拟(非常生产)环境中实验。
9^:xI f$??051Testing软件测试网I.Im&km#})qn rM-AP在这个时刻您想要的是,在JVM消亡之际捕获堆的一个快照——正好-XX:+HeapDumpOnOutOfMemoryError命令可以完成这一操作。51Testing软件测试网x"WkK^N e0V%P]
:y"tj6U"z6gY%OD'k3U0 运行该命令通知JVM拍摄一个“堆转储快照”,并将其保存在一个文件中以便处理,通常使用jhat实用工具(我在上一篇文章中介绍过)。您可以使用相应的-XX:HeapDumpPath标志指定到保存文件的实际路径。(不管文件保存在哪,务必确保文件系统和/或Java流程必须要有权限配置,可以在其中写入。)51Testing软件测试网4~;IB Cx4q'r+PyBJ
51Testing软件测试网1w GNh L7oB2z3.bootclasspath
`n-L5c&o#fxH051Testing软件测试网R U2t2cE;x ^,d N定期将一个类放入类路径是很有帮助的,这类路径与库存JRE附带的类路径或者以某种方式扩展的JRE类路径略有不同。(新Java Crypto API提供商就是一个例子)。如果您想要扩展JRE,那么您定制的实现必须可以使用引导程序ClassLoader,该引导程序可以加载rt.jar中的 java.lang.Object及其所有相关文件。
+IFi A7u~ q#| D X051Testing软件测试网r5H_os@DJ尽管您可以非法打开rt.jar并将您的定制实现或新数据包移入其中,但从技术上您就违反了您下载JDK时同意的协议了。
tL ~B#XW051Testing软件测试网ai@#h @~2|&f$q相反,使用JVM自己的-Xbootclasspath选项,以及皮肤-Xbootclasspath/p和-Xbootclasspath/a。51Testing软件测试网`!O'A RZ-E4x`)z+Z
;h:rO |oPk9]$u5D|,U0 -Xbootclasspath使您可以设置完整的引导类路径(这通常包括一个对rt.jar的引用),以及一些其他JDK附带的(不是 rt.jar的一部分)JAR文件。-Xbootclasspath/p将值前置到现有bootclasspath中,并将 -Xbootclasspath/a附加到其中。51Testing软件测试网8l#j uJ\ _4lb
51Testing软件测试网H:n7l{(x例如,如果您修改了库中的java.lang.Integer,并将修改放在一个子路径mods下,那么-Xbootclasspath/amods参数将新Integer放在默认的参数前面。51Testing软件测试网!J%l*C|P.h$[/M
51Testing软件测试网1w,BgV&_