当前位置:天才代写 > tutorial > JAVA 教程 > 关于JVM呼吁行符号您不知道的5件事:调优JVM机能和Java运行时

关于JVM呼吁行符号您不知道的5件事:调优JVM机能和Java运行时

2017-11-11 08:00 星期六 所属: JAVA 教程 浏览:452

JVM 是大都开拓人员视为理所虽然的 Java 成果和机能背后的重负荷呆板。然而,我们很少有人能领略 JVM 是如何举办事情的 — 像任务分派和垃圾收集、动弹线程、打开和封锁文件、间断和/或 JIT 编译 Java 字节码,等等。

不熟悉 JVM 将不只会影响应用措施机能,并且当 JVM 出问题时,实验修复也会很坚苦。

本期 5 件事 系列 将先容一些呼吁行符号,您可以利用它们来诊断和调优您的 Java 虚拟机机能。

1. DisableExplicitGC

我已记不清有几多次用户要求我就应用措施机能问题提供咨询了,其实只要跨代码快速运行 grep,就会发明清单 1 所示的问题 — 原始 java 机能反模式:

清单 1. System.gc();

// We just released a bunch of objects, so tell the stupid
// garbage collector to collect them already!
System.gc();

显式垃圾收集是一个很是糟糕的主意 — 就像将您和一个猖獗的斗牛犬锁在一个电话亭里。尽量挪用的语法是依赖实现的,但假如您的 JVM 正在运行一个分代的垃圾接纳器(大大都是)System.gc(); 强迫 VM 执行一个堆的 “全部清扫”,固然有的没有须要。全部清扫比一个通例 GC 操纵要昂贵好几个数量级,这只是个简朴数学问题。

您可以不把我的话放在心上 — Sun 的工程师为这个非凡的人工错误提供一个 JVM 符号; -XX:+DisableExplicitGC 符号自动将 System.gc() 挪用转换成一个空操纵,为您提供运行代码的时机,您本身看看 System.gc() 对付整个 JVM 执行有害照旧有利。

2. HeapDumpOnOutOfMemoryError

您有没有经验过这样的环境:JVM 不能利用,不绝抛出 OutOfMemoryError,而您又不能为本身建设调试器来捕捉它或查察呈现了什么问题?像这类偶发和/或不确定的问题,凡是使开拓人员发狂。

买者自负

并不是任何 VM 都支持所有呼吁行符号,Sun/Oracle 的 VM 除外。查明一个符号是否被支持的最好要领是试用它,看它是否正常事情。倘若这些符号在技能上是不支持的,那么,利用它们您要包袱全部责任。假如这些符号中的任何一个使您的代码、您的数据、您的处事器或您的一切消失得无影无踪,我、Sun/Oracle 和 IBM® 都将不认真任。为以防万一,发起先在虚拟(很是出产)情况中尝试。

在这个时刻您想要的是,在 JVM 消亡之际捕捉堆的一个快照 — 正好 -XX:+HeapDumpOnOutOfMemoryError 呼吁可以完成这一操纵。

运行该呼吁通知 JVM 拍摄一个 “堆转储快照”,并将其生存在一个文件中以便处理惩罚,凡是利用 jhat 实用东西(我在 上一篇文章 中先容过)。您可以利用相应的 -XX:HeapDumpPath 符号指定到生存文件的实际路径。(不管文件生存在哪,务必确保文件系统和/或 Java 流程必需要有权限设置,可以在个中写入。)

3. bootclasspath

按期将一个类放入类路径是很有辅佐的,这类路径与库存 JRE 附带的类路径可能以某种方法扩展的 JRE 类路径略有差异。(新 Java Crypto API 提供商就是一个例子)。假如您想要扩展 JRE ,那么您定制的实现必需可以利用引导措施 ClassLoader,该引导措施可以加载 rt.jar 中的 java.lang.Object 及其所有相关文件。

尽量您可以 犯科打开 rt.jar 并将您的定制实现或新数据包移入个中,但从技能上您就违反了您下载 JDK 时同意的协议了。

相反,利用 JVM 本身的 -Xbootclasspath 选项,以及皮肤 -Xbootclasspath/p 和 -Xbootclasspath/a。

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

譬喻,假如您修改了库中的 java.lang.Integer,并将修改放在一个子路径 mods 下,那么 -Xbootclasspath/a mods 参数将新 Integer 放在默认的参数前面。

4. verbose

对付虚拟的或任何范例的 Java 应用措施,-verbose 是一个很有用的一级诊断利用措施。该符号有三个子符号:gc、class 和 jni。

开拓人员实验寻找是否 JVM 垃圾收集器产生妨碍可能导致机能低下,凡是首先要做的就是执行 gc。不幸的是,表明 gc 输出很贫苦 — 足够写一本书。更糟糕的是,在呼吁行中打印的输出在差异的 Java 版本中可能不在差异的 JVM 中会产生改变,这使得正确表明变得更难。

一般来说,假如垃圾收集器是一个分代收集器(大都 “企业级” VMs 都是)。某种虚拟符号将会呈现,来指出一个全部清扫 GC 通路;在 Sun JVM 中,符号在 GC 输出行的开始以 “[Full GC …]” 形式呈现。

想要诊断 ClassLoader 和/或不匹配的类斗嘴,class 可以帮上大忙。它不只陈诉类何时加载,还陈诉类从那里加载,包罗到 JAR 的路径(假如来自 JAR)。

#p#分页标题#e#

jni 很少利用,除了利用 JNI 或当地库时。打开时,它将陈诉各类 JNI 事件,好比,当地库何时加载,要领何时弹回;再一次强调,在差异 JVM 版本中,输出会产生变革。

5. Command-line -X

我列出了 JVM 中提供的我喜欢的呼吁行选项,可是尚有一些更多的需要您本身发明,运行呼吁行参数 -X,列出 JVM 提供的所有非尺度(但大部门都是安详的)参数 — 譬喻:

-Xint,在表明模式下运行 JVM(对付测试 JIT 编译器实际上是否对您的代码起浸染可能验证是否 JIT 编译器中有一个 bug,这都很有用)。

-Xloggc:,和 -verbose:gc 做同样的事,可是记录一个文件而不输出到呼吁行窗口。

JVM 呼吁行选项时常产生变革,因此,按期查察是一个好主意。甚至,您深夜盯着监控器和下午 5 点回家和老婆孩子吃顿晚饭,(可能在 Mass Effect 2 中没落您的仇人,按照您的爱好),它们都是纷歧样的。

竣事语

在出产情况中,呼吁行符号不是为永久利用而设计的 — 事实上,除了您终止用来调优 JVM 垃圾收集器的符号,没有一个非尺度呼吁行标志是专用于出产利用的。可是,作为东西来密查在其他方面完全不透明的虚拟机的内部事情,长短常有用的。

 

    关键字:

天才代写-代写联系方式