名扬数据:需要知道的 5 个 JVM 命令行标志

命令行标志不是为永久使用而设计的事实上,生产环境中。除了您终止用来调优JVM垃圾收集器的标志,没有一个非规范命令行标记是专用于生产使用的但是作为工具来刺探在其他方面完全不透明的虚拟机的内部工作,非常有用的

1.HeapDumpOnOutOfMemoryError

不时抛出OutOfMemoryError而您又不能为自己创建调试器来捕获它或查看出现了什么问题?像这类偶发和/或不确定的问题,您有没有经历过这样的情况:JVM不能使用。通常使开发人员发疯。

买者自负,Sun/OraclVM除外。查明一个标志是否被支持的最好方法是试用它看它否正常工作。倘若这些标志在技术上是不支持的那么,并不是任何VM都支持所有命令行标志。使用它您要承担全部责任。如果这些标志中的任何一个使您的代码、您的数据、您的服务器或您的一切消失得无影无踪,Sun/Oracl和IBM都将不负责任。为以防万一,建议先在虚拟(非常生产)环境中实验。

这个时刻您想要的JVM消亡之际捕获堆的一个快照—正好-XX:+HeapDumpOnOutOfMemoryError命令可以完成这一操作。

通常使用jhat实用工具(上一篇文章中介绍过)您可以使用 相应的-XX:HeapDumpPath标志指定到保管文件的实际路径。不管文件保管在哪,运行该命令通知JVM拍摄一个“堆转储快照”并将其保存在一个文件中以便处理。务必确保文件系统和/或Java流程必需要有权限配置,可以 其中写入。

2.DisableExplicitGC

已记不清有多少次用户要求我就应用顺序性能问题提供咨询了其实只要跨代码快速运行grep就会发现清单1所示的问题—原始Java性能反模式:

 清单 1.System.gc; 

sotellthestupid//Wejustreleasabunchofobjects.

//garbagcollectortocollectthemalready!

这只是个简单数学问题。显式垃圾收集是一个非常糟糕的主意—就像将您和一个疯狂的斗牛犬锁在一个电话亭里。尽管调用的语法是依赖实现的但如果您的JVM正在运行一个分 代的垃圾回收器(大多数是System.gc;强迫VM执行一个堆的全部清扫”虽然有的没有必要。全部清扫比一个常规GC操作要高贵好几个数量 级。

为您提供运行代码的机会,您可以不把我话放在心上—Sun工程师为这个特殊的人工错误提供一个JVM标志;-XX:+DisableExplicitGC标志自动将System.gc调用转换成一个空操作。您自己看看System.gc对于整个JVM执行有害还是有利。

3.verbose

-verbos一个很有用的一级诊断使用顺序。该标志有三个子标志:gcclass和jni对于虚拟的或任何类型的Java应用顺序。

通常首先要做的就是执行 gc倒霉的解释 gc输出很麻烦 足够写一本书。更糟糕的命令行中打印的输出在不同的Java版本中或者不在不同的JVM中会发生改变,开发人员尝试寻找是否 JVM垃圾收集器发生故障或者导致性能低下。这使得正确解释变得更难。

如果垃圾收集器是一个分代收集器(多数“企业级”VM都是某种虚拟标志将会出现,一般来说。来指出一个全部清扫GC通路;SunJVM中,标志在GC输出行的开始以“[FullGC...]形式呈现。

class可以帮上大忙。不只演讲类何时加载,想要诊断ClassLoad和/或不匹配的类冲突。还演讲类从何处加载,包括到JA R路径(如果来自JA R

除了使用JNI或本地库时。打开时,jni很少使用。将报告各种JNI事件,比方,外地库何时加载,方法何时弹回;再一次强调,不同JVM版本中,输出会发生变化。

4.Command-line-X

但是还有一些更多的需要您自己发现,列出了JVM中提供的喜欢的命令行选项。运行命令行参数-X列出JVM提供的所有非标准(但大部分都是平安的参数—例如:

-Xint解释模式下运行JVM对于测试JIT编译器实际上是否对您的代码起作用或者验证是否JIT编译器中有一个bug这都很有用)

但是记录一个文件而不输出到命令行窗口。-Xloggc:和-verbose:gc做同样的事。

因此,JVM命令行选项时常发生变化。定期检查是一个好主意。甚至,您深夜盯着监控器和下午5点回家和妻子孩子吃顿晚饭,或者在MassEffect2中消灭您的敌人,根据您的喜好)都是不一样的

5.bootclasspath

定期将一个类放入类路径是很有帮助的这类路径与库存JRE附带的类路径或者以某种方式扩展的JRE类路径略有不同。新JavaCryptoAPI提供商就是一个例子)如果您想要扩展JRE那么您定制的实现必需可以使用引导顺序ClassLoad该引导顺序可以加载rt.jar中的java.lang.Object及其所有相关文件。

但从技术上您就违反了您下载JDK时同意的协议了尽管您可以非法打开rt.jar并将您的定制实现或新数据包移入其中。

使用JVM自己的-Xbootclasspath选项,相反。以及皮肤-Xbootclasspath/p和-Xbootclasspath/a

并将 -Xbootclasspath/a附加到其中。-Xbootclasspath使您可以设置完整的引导类路径(这通常包括一个对rt.jar引用)以及一些其他JDK附带的不是rt.jar一部分)JA R文件。-Xbootclasspath/p将值前置到现有bootclasspath中。

如果您修改了库中的java.lang.Integ并将修改放在一个子路径mod下,例如。那么-Xbootclasspath/amod参数将新Integer放在默认的参数前面。