`
everest729
  • 浏览: 1594 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

你不知道的5个JVM命令行标志(转载)

阅读更多
本文是Neward & Associates的总裁Ted Neward为developerworks独家撰稿“你不知道java秘密”系列中的一篇,JVM是多数开发人员视为理所当然的Java功能和性能背后的重负荷机器。然而,我们很少有人能理解JVM是如何进行工作的—像任务分配和垃圾收集、转动线程、打开和关闭文件、中断和/或JIT编译Java字节码,等等。

不熟悉JVM将不仅会影响应用程序性能,而且当JVM出问题时,尝试修复也会很困难。

本文将介绍一些命令行标志,您可以使用它们来诊断和调优您的Java虚拟机性能。

1.DisableExplicitGC

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

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/amods参数将新Integer放在默认的参数前面。

4.verbose

对于虚拟的或任何类型的Java应用程序,-verbose是一个很有用的一级诊断使用程序。该标志有三个子标志:gc、class和jni。

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

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

想要诊断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

    5个JVM命令行标志.docx

    本文主要探讨了五个不常为人知但对性能调优至关重要的JVM命令行标志。 1. **-XX:+DisableExplicitGC**:这个标志用于禁止应用程序中显式调用`System.gc()`。通常情况下,显式调用垃圾收集器是一种反模式,因为它...

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

    以下是五个关键的JVM命令行标志,它们可以帮助你更好地诊断和优化JVM的性能。 1. **-XX:+DisableExplicitGC** 这个标志用于禁用代码中显式调用`System.gc()`的行为。通常,Java应用不应直接触发垃圾收集,因为垃圾...

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

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

    JVM命令行监测工具详解

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

    一个jvm启动多个springboot服务

    在Java世界中,JVM(Java虚拟机)是运行所有Java应用程序的基础,它为每个应用程序提供了一个独立的运行环境。Spring Boot是一个简化Spring应用开发的框架,它通过提供默认配置和starter项目,使得构建微服务变得...

    jdk命令行工具.doc

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

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

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

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

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

    JVM监控实例数 windows监控 线程测试 单例模式下测试JVM实例是否一个

    如果你在多个地方调用这个方法,JVM只会创建一个`Singleton`对象,验证这一点可以通过检查`instance`变量是否只被初始化一次。 总的来说,理解和监控JVM的实例数以及线程状态是Java开发中的重要技能。通过`jps`和`...

    jdk,jvm源码

    Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...

    java命令行辅助工具

    这将在同一目录下创建一个`HelloWorld.class`文件,这是Java虚拟机(JVM)可以理解的字节码。然后,我们可以使用`java`命令来运行已编译的类: ```sh java HelloWorld ``` 这个Java命令行辅助工具可能实现了自动化...

    [转载]深入理解JVM

    一个典型的JVM实例包含以下几个主要部分: 1. **类装载子系统**:负责查找、装载和链接类文件。 2. **运行引擎**:负责执行已装载类中的字节码指令。 3. **方法区**:用于存储每个类的信息,如类的方法和字段数据。...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...

    JVM图解-JVM指令-JVM原型图.rar

    在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...

    Tomcat JVM的参数调优

    完全垃圾收集应在3-5秒内完成,如果超过这个时间,可能需要调整JVM参数或考虑使用不同的垃圾收集器策略。 最后,为了提高效率,推荐缩小最大内存和最小内存之间的差距,以减少内存碎片并提高利用率。同时,增加...

    jvm内存监控工具使用

    JConsole 是一个图形化工具,提供了丰富的监控功能,包括但不限于内存使用、线程状态、类加载、垃圾收集等。它能够以图表的形式展示各种数据,使开发者能够直观地理解 JVM 的运行状态。此外,JConsole 支持远程连接...

Global site tag (gtag.js) - Google Analytics