`

关于 JVM 命令行标志您不知道的 5 件事(来自IBM)

阅读更多
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)。

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 垃圾收集器的标志,没有一个非标准命令行标记是专用于生产使用的。但是,作为工具来刺探在其他方面完全不透明的虚拟机的内部工作,是非常有用的。

分享到:
评论

相关推荐

    你必须知道的5个JVM命令行标志

    你必须知道的5个JVM命令行标志 解压密码 www.jiangyea.com

    关于_JVM_命令行标志您不知道的_5_件事及命令行参数列表

    ### 关于JVM命令行标志您不知道的5件事及命令行参数列表 #### DisableExplicitGC:禁用显式垃圾收集 在Java应用中,开发者有时可能会遇到性能瓶颈问题,尤其是在频繁调用`System.gc();`的情况下。这个命令实际上...

    5个JVM命令行标志.docx

    5. **其他高级调优选项**:JVM有许多其他命令行标志,如调整堆大小(`-Xms`和`-Xmx`),控制垃圾收集策略(`-XX:NewRatio`, `-XX:SurvivorRatio`等),以及启用或禁用特定的JVM特性。这些选项需要根据应用的具体需求...

    Java程序员必须知道的5个JVM命令行标志

    了解并熟练使用JVM的命令行标志是每个Java程序员必备的技能。以下是五个关键的JVM命令行标志,它们可以帮助你更好地诊断和优化JVM的性能。 1. **-XX:+DisableExplicitGC** 这个标志用于禁用代码中显式调用`System....

    JVM命令行监测工具详解

    为了监控和调试JVM的运行状态,Oracle提供了多个命令行工具,包括jps、jstack、jstat、jmap和jcmd。这些工具可以帮助开发者了解和解决性能问题,优化应用程序。 一、jps (Java Process Status) jps是查看当前系统中...

    IBM JVM参数选项

    本文将详细解释IBM JVM中的关键参数及其功能,帮助您更好地管理和调优Java应用。 #### 基础参数 1. **-cp 或 -classpath**: 用于指定类路径,即Java程序运行时搜索类和接口的位置。在Windows系统中,路径之间使用...

    ibm HeapAnalyzer JVM内存分析工具 ha457.jar下载

    同时,理解如何在Java应用中生成堆转储文件也是必不可少的,这通常可以通过JVM的命令行选项或者JMX接口来实现。 总之,IBM HeapAnalyzer是Java开发者诊断和修复内存问题的强大武器。通过熟练使用这个工具,你可以...

    IBM JVM GC 技术文档

    - **可重置JVM**:IBM JVM提供了可重置功能,允许在不重启整个JVM的情况下重置某些状态,如GC相关统计信息。 ##### 4. 详细的GC日志输出 - **详细的GC日志**:IBM JVM支持输出详细的GC日志信息,帮助开发者监控和...

    IBM Java JVM Diagnostic Guide

    ### IBM Java JVM Diagnostic Guide #### 一、关于本书 **本书概述了IBM Java虚拟机(JVM)的工作原理、调试技巧以及可用于解决JVM问题的诊断工具。** 本书旨在帮助开发人员、系统管理员和技术支持工程师更好地...

    jdk命令行工具.doc

    jvm命令行工具,java性能优化,jdk命令工具, jcmd命令、jps命令、jmap命令、jstack命令、jinfo命令、jstat命令

    JVM调优前戏之JDK命令行工具.docx

    JVM调优前戏之JDK命令行工具 JVM调优前戏之JDK命令行工具是JDK中的一组命令行工具,用于监测JVM运行时的状态。这些工具对于普通开发人员来说可能不太熟悉,但它们却是JVM调优的重要步骤。在这篇文章中,我们将详细...

    IBM SDK, Java Technology Edition, Version 5.0 IBM Java JVM诊断指南

    本章重点讨论了IBM SDK, Java Technology Edition, Version 5.0中JVM的内存管理机制,包括但不限于: - **内存管理概述**:解释了JVM如何处理内存分配和释放。 - **对象分配**:探讨了JVM如何分配内存空间来存储新...

    IBM MOOC JVM Troubleshooting

    IBM Open source course for JVM troubleshooting it's a course for medium and experienced java developer

    IBM JVM javaCore 分析工具

    IBM JVM 分析工具,JCA,javaCore查看工具

    深入JVM内核—原理、诊断与优化视频教程-3.常用JVM配置参数

    此外,JDK自带的JMX(Java Management Extensions)和JVM命令行工具(如jstat、jmap、jhat)也是进行性能诊断的重要手段。 在优化方面,JVM配置参数起着决定性作用。例如,“-Xms”和“-Xmx”用于设置堆内存的初始...

    ibm jvm argument.pdf

    ### IBM JVM Argument与Windows Java地址空间管理 在深入探讨IBM JVM参数如何影响Windows下的Java应用程序之前,我们首先需要理解在32位Windows操作系统上,Java虚拟机(JVM)是如何管理和利用有限的地址空间的。这...

    jdk,jvm源码

    5. 内存管理:JVM的垃圾回收机制自动管理内存,包括对象的分配和回收。常见的垃圾收集算法有标记-清除、复制、标记-整理和分代收集等。 6. 多线程:JVM支持多线程并发执行,每个线程都有自己的程序计数器和虚拟机栈...

    IBM-JVM.rar_jvm_site:www.pudn.com

    IBM JVM.rar_jvm_site:www.pudn.com 这个压缩包文件主要聚焦于IBM的Java虚拟机(JVM)的深入解析,尤其侧重于其内存管理和底层运作机制的探讨。Java虚拟机是Java程序执行的核心,它为Java应用程序提供了一个跨平台的...

Global site tag (gtag.js) - Google Analytics