【叶凡网络】您不知道的5件事JVM命令行标志

2014-02-20 13:39:06 | 新闻来源:叶凡网络 | 点击量:696

命令行标志不是为永久使用而设计的事实上,生产环境中。除了您终止用来调优 JVM垃圾收集器的标志,没有一个非规范命令行标记是专用于生产使用的但是作为工具来刺探在其他方面完全不透明的虚拟机的内部工作,非常有用的很少有人能理解 JVM如何进行工作的像任务分配和垃圾收集、转动线程、打开和关闭文件、中断和/或 JIT编译 Java字节码,JVM多数开发人员视为理所当然的Java功能和性能背后的重负荷机器。然而。等等。不熟悉 JVM将不只会影响应用顺序性能,而且当 JVM出问题时,尝试修复也会很困难。本文将介绍一些命令行标志,您可以使用它来诊断和调优您的Java虚拟机性能。

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

清单System.gc;

sotellthestupid //Wejustreleasabunchofobjects.

//garbagcollectortocollectthemalready! 

System.gc;

这只是个简单数学问题。显式垃圾收集是一个非常糟糕的主意 就像将您和一个疯狂的斗牛犬锁在一个电话亭里。尽管调用的语法是依赖实现的但如果您的JVM正在运行一个分代的垃圾回收器(大多数是System.gc;强迫 VM执行一个堆的全部清扫”虽然有的没有必要。全部清扫比一个常规 GC操作要高贵好几个数量级。为您提供运行代码的机会,您可以不把我话放在心上 Sun工程师为这个特殊的人工错误提供一个 JVM标志;-XX:+DisableExplicitGC标志自动将 System.gc调用转换成一个空操作。您自己看看 System.gc对于整个 JVM执行有害还是有利。

2.HeapDumpOnOutOfMemoryError

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

Sun/OraclVM除外。查明一个标志是否被支持的最好方法是试用它看它否正常工作。倘若这些标志在技术上是不支持的那么,买者自负并不是任何 VM都支持所有命令行标志。使用它您要承担全部责任。如果这些标志中的任何一个使您的代码、您的数据、您的服务器或您的一切消失得无影无踪,Sun/Oracl和 IBM?都将不负责任。为以防万一,建议先在虚拟(非常生产)环境中实验。这个时刻您想要的JVM消亡之际捕获堆的一个快照 正好 -XX:+HeapDumpOnOutOfMemoryError命令可以完成这一操作。通常使用 jhat实用工具。您可以使用相应的-XX:HeapDumpPath标志指定到保管文件的实际路径。不管文件保管在哪,运行该命令通知 JVM拍摄一个 堆转储快照”并将其保存在一个文件中以便处理。务必确保文件系统和/或 Java流程必需要有权限配置,可以在其中写入。

3.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放在默认的参数前面。

4.Command-lin-X

但是还有一些更多的需要您自己发现,列出了JVM中提供的喜欢的命令行选项。运行命令行参数 -X列出 JVM提供的所有非标准(但大部分都是平安的参数 例如:-Xint解释模式下运行 JVM对于测试 JIT编译器实际上是否对您的代码起作用或者验证是否 JIT编译器中有一个 bug这都很有用),但是记录一个文件而不输出到命令行窗口。-Xloggc:和 -verbose:gc做同样的事。因此JVM命令行选项时常发生变化。定期检查是一个好主意。甚至,您深夜盯着监控器和下午 5点回家和妻子孩子吃顿晚饭,或者在MassEffect2中消灭您的敌人,根据您的喜好)都是不一样的

5.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版本中,输出会发生变化。

 

上一篇:【叶凡网络】在阿根廷的上空疑似出现了流星体爆炸 下一篇:【叶凡网络】中国驻美大使浅谈构建新型大国关系要有建设性态度