- 浏览: 241749 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (172)
- J2SE学习模块 (35)
- Oracle学习模块 (12)
- Jsp学习模块 (11)
- Servlet学习模块 (1)
- Tomcat 模块 (4)
- Struts1.x学习模块 (5)
- Spring学习模块 (2)
- Hibernate学习模块 (11)
- XML学习模块 (1)
- UML学习模块 (0)
- 算法学习模块 (6)
- 设计模式模块 (2)
- Mysql学习模块 (1)
- SQL_Server学习模块 (8)
- 项目开发模块 (10)
- 搜索引擎 (14)
- 开发工具的使用 (2)
- 面试题集 (7)
- 开发工具 (8)
- Linux (5)
- JavaFX模块 (1)
- 程序与人生 (4)
- 计算机网络 (6)
- EJB学习模块 (1)
- javascript常用模块 (2)
- 英语学习 (1)
- 程序变量命名的几条法则:匈牙利命名法 (1)
- 驼峰式大小写 (1)
- 帕斯卡命名法 (1)
- Jquery控制图片宽度及高度 (1)
- 喜讯--FireFox7.01已经支持CSS中 text-overflow ellipsis 属性 (1)
- 遍历 Map 的三种 常用方法 java (1)
- JDK自带工具Jstat (1)
- 提高 Oracle 查询 效率 建议 (1)
- 常用工具 (1)
最新评论
-
a465492689:
挺好,谢谢分享
存储过程 -
huangqinghe:
ding 顶~~~
Intellij Idea12 中文乱码问题总结 -
Redpick13:
楼主好人啊,有耐心
Java中的二维数组的定义与学习 -
dandongsoft:
神鼎飞丹砂
java.lang.NoClassDefFoundError: org/apache/lucene/index/memory/MemoryIndex -
devil__lord:
不错讲得很清楚 color=#cff
Java中的二维数组的定义与学习
简介: Java™ 虚拟机有数百个命令行选项,被经验丰富的开发人员用来调优 Java 运行时。本文中,您将学习如何监控和记录编译器性能、禁用显式垃圾收集(System.gc();)、扩展 JRE 等等。
JVM 是多数开发人员视为理所当然的 Java 功能和性能背后的重负荷机器。然而,我们很少有人能理解 JVM 是如何进行工作的 — 像任务分配和垃圾收集、转动线程、打开和关闭文件、中断和/或 JIT 编译 Java 字节码,等等。
不熟悉 JVM 将不仅会影响应用程序性能,而且当 JVM 出问题时,尝试修复也会很困难。
本期 5 件事 系列 将介绍一些命令行标志,您可以使用它们来诊断和调优您的 Java 虚拟机性能。
1. DisableExplicitGC
我已记不清有多少次用户要求我就应用程序性能问题提供咨询了,其实只要跨代码快速运行 grep,就会发现清单 1 所示的问题 — 原始 java 性能反模式:
清单 1. 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 垃圾收集器的标志,没有一个非标准命令行标记是专用于生产使用的。但是,作为工具来刺探在其他方面完全不透明的虚拟机的内部工作,是非常有用的。
转载自:http://www.ibm.com/developerworks/cn/java/j-5things11/
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 垃圾收集器的标志,没有一个非标准命令行标记是专用于生产使用的。但是,作为工具来刺探在其他方面完全不透明的虚拟机的内部工作,是非常有用的。
转载自:http://www.ibm.com/developerworks/cn/java/j-5things11/
发表评论
-
巧用JDK自带工具Jstat查看Gc垃圾回收之使用方法
2012-07-19 09:40 3915如何查看JVM中内存使用情况如何? JVM垃圾回收是否正常? ... -
遍历Map的三种常用方法 java
2011-11-09 12:06 28861、一般的map定义: Map<Key, Object& ... -
程序变量命名的几条法则:匈牙利命名法,驼峰式大小写,帕斯卡命名法
2011-09-07 17:54 51301.匈牙利命名法的好处: ... -
JDK源码中对当前时间的一些用法
2011-09-05 14:51 1079JDK源码中对当前时间的一些用法: String[] ... -
Eclipse安装反编译工具查看Jar包源码 JD Eclipse插件
2011-08-24 10:37 5089如何在Eclipse中安装反编译工具查看Jar包源码呢? 打 ... -
Struts2图片上传成功后,异常:java.lang.IllegalStateException
2011-07-10 18:49 19481.场景: 使用Struts2图片上传成功后出现异常: ... -
J2EE表生成器@TableGenerator
2011-03-31 14:29 1726最近工作中遇到了许多 ... -
Spring Hibernate Extjs开发指南
2011-03-23 18:08 982从学习到找工作,然后再面试,最后才经历上班; 从这段时间对自 ... -
获取当前时间的前三个月 java
2011-03-17 11:14 4743获取当前时间的前三个月: Date date = n ... -
java 线程的状态与控制
2010-12-16 20:54 1123一、线程的状态 线程的主要状态有: 1.新 ... -
MyEclipse Blue 6.5 注册码 可到2013年12月
2010-12-06 09:44 1520做Java软件开发的,首选的软件工具莫非是MyEclip ... -
关于 Java Collections API 您不知道的 5 件事,第 2 部分
2010-10-24 00:28 524简介: 您可以在任何地方使用 Java™ 集合,但是一定要小心 ... -
关于 Java 常用工具您不知道的 5 件事
2010-10-24 00:25 520简介: 有些 Java™ 工具无法分类,只能算作 “有用的东西 ... -
关于 Java Database Connectivity 您不知道的 5 件事
2010-10-24 00:21 501简介: JDBC,即 Java™ Database Conne ... -
关于 Java Scripting API 您不知道的 5 件事
2010-10-24 00:17 581简介: Java™ 语言足以满足您的一些项目的需求,但是脚本语 ... -
关于 Java 性能监控您不知道的 5 件事,第 2 部分
2010-10-24 00:15 565简介: 如果 JDK 中配置有全功能分析器 JConsole ... -
关于 Java 性能监控您不知道的 5 件事,第 1 部分
2010-10-24 00:13 759简介: 责怪糟糕的代码 ... -
关于 JAR 您不知道的 5 件事
2010-10-24 00:11 404简介: 除了一些基础的 JAR 之外,许多 Java™ 开发人 ... -
关于 java.util.concurrent 您不知道的 5 件事,第 2 部分
2010-10-24 00:05 482简介: 除了具有很好的并发性的 Collections,jav ... -
关于 java.util.concurrent 您不知道的 5 件事,第 1 部分
2010-10-24 00:02 490简介: 编写能够良好执行,防止应用程序受损的多线程代码是很艰巨 ...
相关推荐
你必须知道的5个JVM命令行标志 解压密码 www.jiangyea.com
### 关于JVM命令行标志您不知道的5件事及命令行参数列表 #### DisableExplicitGC:禁用显式垃圾收集 在Java应用中,开发者有时可能会遇到性能瓶颈问题,尤其是在频繁调用`System.gc();`的情况下。这个命令实际上...
本文主要探讨了五个不常为人知但对性能调优至关重要的JVM命令行标志。 1. **-XX:+DisableExplicitGC**:这个标志用于禁止应用程序中显式调用`System.gc()`。通常情况下,显式调用垃圾收集器是一种反模式,因为它...
以下是五个关键的JVM命令行标志,它们可以帮助你更好地诊断和优化JVM的性能。 1. **-XX:+DisableExplicitGC** 这个标志用于禁用代码中显式调用`System.gc()`的行为。通常,Java应用不应直接触发垃圾收集,因为垃圾...
10. **JVM诊断工具**:JDK提供了丰富的命令行工具,如jps(Java进程查看)、jstat(统计JVM各种数据)、jmap(内存映射工具)、jhat(堆转储分析)、jconsole(GUI监控工具)等,用于监控和诊断JVM的运行状态。...
根据题目提供的部分输出内容,我们可以看到关于JVM版本、Java系统属性等详细信息。例如: - `JVM version is 14.0-b16` 表示当前JVM的版本号为14.0-b16。 - `java.runtime.name=Java(TM) SE Runtime Environment` ...
在启动时,JVM会读取命令行参数来配置其运行环境,并加载必要的类和资源。此过程包括以下几个关键步骤: - **读取命令行参数**:这些参数可以控制JVM的行为,例如内存分配、垃圾回收策略等。 - **设置JVM选项**:...
jinfo可以连接到正在运行的Java进程或核心文件,并显示虚拟机配置的命令行标志。 4. jstat:用于收集Java虚拟机的统计信息。这个工具可以用来检测垃圾收集和堆内存状况,包括年轻代、老年代和持久代的使用情况。 5...
- `-V`:输出通过标志文件(如`.hotspotrc`文件或其他由`-XX:Flags=<filename>`指定的文件)传递给JVM的参数。 - **jstat**: - **用途**:实时监控Java应用程序的资源和性能,特别适合于监控堆大小和垃圾回收的...
差异bcdiff 是一个用 Scala 编写的命令行 JVM 类文件差异工具。 bcdiff 支持: 显示两个类文件(名称、标志、实现的接口...)之间元数据的差异, 在两个类文件之间以一种聪明的标签感知方式区分匹配方法(具有相同...
- `-v`:显示每个进程启动时传递给JVM的命令行参数。 - `-m`:显示传递给main方法的参数。 - `-l`:显示main类或jar的完全限定名称。 示例: ```bash [root@tomcat ~]# jps -l -v ``` 2. **jinfo ...
### JVM相关的常见面试问题知识点汇总 #### 1. 什么是JVM? - **定义**: JVM全称Java Virtual Machine,即Java虚拟机,是Java程序运行的底层平台。 - **作用**: 它为Java应用程序提供了一个运行环境,可以执行Java...
- **可定制性**:支持通过命令行参数(如-Xmx)调整JVM的行为,如设置最大堆内存等。 **特点:** - **平台独立性**:JVM为Java程序提供了与硬件和操作系统无关的运行环境。 - **安全性**:内置的安全机制确保了程序...
例如,我们可以通过`jinfo -flag <flag> <pid>`查看某个Java进程是否启用了特定的JVM标志,或者使用`jinfo -flags <pid>`列出所有有效的JVM标志。 `jmap`则是一个用于分析堆内存的工具。它允许我们导出堆内存的...
JVM监控代理 监视JVM线程并在给定时间内阻塞线程时保存线程转储。 用法 从下载jar 将其添加到要监视的应用程序的命令行中: java -javaagent:jvm-monitoring-agent-0.9.0.jar=threshold=1000,debug ...rest of ...
### Java命令行详解 在Java开发过程中,命令行工具扮演着至关重要的角色,尤其是在编译、运行Java程序时。本文将详细介绍`javac`命令及其常用选项,帮助初学者更好地理解和掌握这一工具。 #### javac 命令概述 `...
5. **jinfo**: jinfo 用于查看JVM的配置信息,包括系统属性和JVM标志。例如,`jinfo -sysprops process_id`可以显示系统属性,而`jinfo -flag flag_name process_id`则可以查看特定的JVM标志。 6. **jstack**: ...
jmap是JDK自带的一个命令行工具,用于收集和分析JVM内存信息,主要包括堆内存、类加载器统计和对象 finalize 队列等。本文将详细介绍jmap的使用方法。 ### 前言 在Java性能调优过程中,开发者通常会使用各种开源...
在命令行中启动Java应用时添加这些标志,然后指定要分析的方法或整个类,就能看到相应的机器码输出。 hsdis的工作原理是通过JIT(Just-In-Time)编译器来实现的,JIT编译器将热点代码从字节码编译为本地机器码,以...