- 浏览: 1076741 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (399)
- C++ (39)
- Java (74)
- Java界面开发学习笔记 (4)
- Java用户的c++之旅 (0)
- 自言自语 (12)
- DSP (1)
- MCU (0)
- CG (0)
- Jabber (0)
- Gloox (0)
- Linux (11)
- Windows (19)
- Networks (4)
- Jobs (0)
- PHP (1)
- JSP (2)
- 生活 (35)
- C (2)
- Qt4 (2)
- C# (50)
- WPF (5)
- ASP (2)
- FLEX (47)
- SQL (20)
- JavaScript (12)
- SharePoint (6)
- GWT (1)
- Dojo (9)
- HTML (11)
- Others (7)
- 如何安装配置系列 (7)
- UML (2)
- Android (3)
- alibaba (1)
最新评论
-
zxjlwt:
学习了http://surenpi.com
Firefox插件开发: Hello World! -
ylldzz:
楼主知道MVEL怎么调试么
MVEL简介及快速使用 -
blueman2012:
您好,可否提供源码下载,我把您的代码贴过来后,好多报错的,谢谢 ...
Log4J日志解析 -
svygh123:
你的游标都没有关闭呢!
MYSQL游标嵌套循环示例 -
dizh:
写的很好啊
MVEL简介及快速使用
这是Ted Neward在IBM developerWorks中5 things系列文章中的一篇,讲述了关于JVM命令行参数的一些应用窍门,值得大家学习。(2010.09.01最后更新)
摘要:Java虚拟机有数百个命令行选项,只有经验十分丰富的Java开发员才会使用这些选项去调优Java运行时环境。学习如何监控并记录编译器性能,禁用显示的垃圾收集(System.gc()),扩展JRE,及其它。
JVM是Java应用程序功能与性能背后的实际工作者,大部分Java开发者认为这是理所当然的。然而我们中很少有人真正地理解JVM是如何做到这些事的--如,分配并收集垃圾对象,摆弄线程,打开及关闭文件,解释和/或使用JIT编译Java字节码,以及其它任务。
不熟悉JVM不仅会使你在应用程序的性能方面付出代价,而且当JVM出了某些问题时,还很难进行修复。
5 things系列的这篇文章介绍一些好用的命令行JVM选项,你可以使用它们去诊断并调优Java虚拟机的性能。
1. DisableExplicitGC
我无法告诉你我已经多少次被要求就应用程序性能问题进行咨询了,而我只是简单地对代码文件执行grep命令就能发现如清单1所示的程序--这就是早期Java性能的反模式:
Listing 1. System.gc();
// garbage collector to collect them already!
System.gc();
显式地执行垃圾收集器确实是个坏主意--这就像把你自己与一个疯狂的斗牛犬锁在电话亭中那样。虽然该调用的确切语义依赖于具体的实现,但假设你的JVM运行着一个分代垃圾收集器(大多数JVM也正是如此),System.gc()方法强制要求VM对Heap进行"全面清扫",即便有些并不是必要的。一般地,全面清扫的开销要比常规GC操作要大几个数量级,而常规GC操作的开销只会产生纯数学的负作用。
但不要相信我的话--为了这个特殊的人为错误,Sun的工程师们为我们提供了一个JVM选项:-XX:+DisableExplicitGC选项自动地将System.gc()调用置为无用操作,给你一个机会去执行程序,并让你自己看看System.gc()是否已经帮助或损害整个JVM的执行。
2. HeapDumpOnOutOfMemoryError
你肯定曾经遇到过JVM不断死掉的情况,即抛出OutOfMemoryError,在你的一生中似乎都不能设置一个调试器去捕获这个错误,并看看是出了什么问题?像这些不时发生且/或无法确定的问题能使一个开发员完全疯掉。
你所想的,就是在在JVM快死掉时能够捕获Heap的快照--这正是命令-XX:+HeapDumpOnOutOfMemoryError所要做的。
运行该命令就是告诉JVM创建一个"Heap转储快照",并将它保存为一个文件以便于处理,常常使用jhat工具(在前一篇文章中我有介绍过)。使用相应的命令-XX:HeapDumpPath,就指定被保存文件的确切路径。(不论文件保存在何处,要先确保文件系统和/或Java进程有必要的仅限配置能在那儿写文件。)
3. bootclasspath
偶尔地,将某个类,该类不同于原有的或以某种方式扩展而得到的JRE所存储的类,置于类路径中是有用的。(一个例子就是新的Java Crypto API适配器)。如果你想扩展JRE,那么你的定制实现需要能用于引导ClassLoader,该ClassLoader会加载java.lang.Object以及它在rt.jar中的所有同族成员。
尽管你可以打开rt.jar并将你定制实现或新的包放入其中,但在技术上这就违反了当初你在下载JDK时所同意的协议。
相反地,应该使用JVM自己的-Xbootclasspath选项,以及它的兄弟选项-Xbootclasspath/p和-Xbootclasspath/a。
-Xbootclasspath允许你设置整个引导类路径,该路径一般地必须包含一个针对rt.jar的引用,再加上一批随JDK发布但不是rt.jar一部分的其它JAR文件。-Xbootclasspath/p会向已有引导类路径中预置值,然后-Xbootclasspath/a会将它连接起来。
例如,如果你已经修改了原有的java.lang.Integer,并将修改后的程序放入子目录,mods,然后参数-Xbootclasspath/a mods将会在加载原有默认Integer类之前加载这个新的Integer实现。
4. verbose
对于任何类型的Java应用,-verbose都是头等有用的诊断工具。该选项有三个子选项:gc,class和jni。
一般地,如果JVM垃圾收集器在运行并导致了低下的性能,那么gc就是开发员们第一次想要弄清楚的地方。不幸地是,解释gc的输出需要些技巧,这足够成为一整本书的主题了。更糟地是,在命令行窗口打印出的输出对于不同的Java发行版是不同的,或者对于不同的JVM也是不同的,这造成难以对其进行正确地解释。
一般来说,如果垃圾收集器是分代收集器(大多数"企业级"VM正是如此),会有一些布尔型选项去指定是否使用完全清除;在Sun的JVM中,这样的选项会以[Full GC ...]的形式出现在GC输出行的开头。
class会是一个生命保护者,它尝试着诊断ClassLoader和/或不匹配的类冲突。它不仅会报告类是在何时被加载的,而且也会报告类是从何处被加载的,包括JAR文件的路径,如果这个类来自于一个JAR的话。
jni很少用到,除非你有使用JNI和原生库。当启用该选项时,它会报告各种JNI事件,例如原生库何时被加载的,以及方法何时被绑定的;另外,该报告输出会由于不同的Java版或JVM实现而不尽相同。
5. 命令行-X
我已经列出了一些JVM提供的且我比较喜欢的命令行选项,但还有更多的选项你自己就能发现到。运行命令行参数-X列出所有JVM支持的非标准的(但多数就是安全的)参数--就像这些:
-Xint,使JVM以解释模式进行运行(对于测试JIT编译器是否真的作用到你的程序,或是证明你是否有Bug在JIT编译器中,该选项是很用的)。
-Xloggc:,该参数所做的与-verbose:gc相同,但它会把日志记录到一个文件中,而不是一股脑地输出在命令窗口中。
JVM命令行选项改了一次又一次,所以隔一段时间再去看会是一个好主意。这种区别就好像是,花上一整夜金城汤池盯着你的显示器,或者是下午五点就回家与爱人和孩子享用美餐(或是在Mass Effect 2中屠杀敌人,这取决于你的偏好)。
结论
命令行选项的本意不是为了在产品环境中永久使用--事实上,除了你(可能)最终用于调优JVM垃圾收集器的选项之外,非标准的命令选项都不会被刻意地用到产品中。但作为能够窥探到完全不透明的虚拟机的内部工部情形的工具,它们是无价的。
5 things系列的下一篇文章:Java日常工具。
发表评论
-
Interesting interview question…
2011-06-23 19:10 1448Today I was asked this questi ... -
简单易用的Web框架:SummerCool介绍
2011-05-10 19:01 4744SummerCool是国内某大型电子商务平台的架构师自 ... -
[转]Eclipse插件:Java AST View
2011-05-06 16:03 4614转载:http://www.blogjava.net/life ... -
Eclipse之Debug技巧
2011-05-02 15:30 1560你认为你的eclipse debug技能都学会了吗?能够熟 ... -
AccessController.doPrivileged 小记
2011-04-29 20:29 2075原文:http://blog.csdn.net/tea ... -
推荐一个下载源码的网站
2011-04-29 20:26 1245http://olex.openlogic.com/ 这个网 ... -
Java解析xml禁止校验dtd
2011-04-27 21:34 8390今天在做log4j.xml解析的时候,指定了如下的dtd声明: ... -
区分getName、getCanonicalName与getSimpleName
2011-04-27 18:34 5765举例,现有一个类如下: package com.sha ... -
Log4J日志解析
2011-04-25 16:12 7053在有些场景下,需要解析Log4J的日志,以为己用。比如,根据 ... -
分享个不错的网站:看JSON字符串的利器
2011-04-20 20:09 1304分享个不错的网站:看JSON字符串的利器or胸器 http: ... -
Regex:密码验证
2011-04-13 18:45 20044.当且仅当含数字和字母的密码验证 如果密码当且仅当 ... -
JDBC操作数据库时切记关闭资源
2011-04-08 18:14 1865Error: No ManagedConnectio ... -
JDBC:如何将resultset的信息自动封装到pojo里面
2011-04-08 10:32 4308不多说了 直接上代码 Java代码 p ... -
Maven自动升级版本号并打包上传的脚本
2011-04-02 09:52 7517同事写的自动升级版本并打包上传的脚本: echo of ... -
在ibatis中使用$value$引入变量会引入SQLInjection漏洞
2011-04-01 16:26 2312(1)sql语法中的_关键字_.如果sql语句中出现存在用户输 ... -
EqualsBuilder和HashCodeBuilder
2011-03-31 19:30 2221自动化hashCode()和equals() 问题产生:当需 ... -
Eclipse中的Stack Trace Console的使用
2011-03-15 14:47 3023很多的Java程序员(特别是开发Web程序的时候),通常在 ... -
System.out.format的使用
2011-01-21 12:34 4794JDK5.0允许象C语言那样直接用printf()方法来格式化 ... -
jhat的简单使用
2011-01-18 19:41 2890leak一般会发生在容器类保存对象引用而不删除的时候,替代方法 ... -
关于变更eclipse中maven插件的repository路径
2011-01-10 10:02 17031.打开eclipse 2.window-->ref ...
相关推荐
【标题】"nginx-upstream-jvm-route-1.15" 涉及的核心知识点是Nginx的upstream模块与JVM路由的整合,特别针对Nginx 1.15版本。这个项目旨在解决在配置Nginx时遇到的特定错误提示“nginx: [emerg] invalid parameter ...
此资源有两个文件,含 nginx-upstream-jvm-route 和 nginx 对应版本,都是tar.gz文件。 安装方法网上很多就不写了,亲测可用。 不用担心版本不匹配造成安装失败,再浪费积分去到处下载尝试的烦恼。 此资源有两个文件...
kotlinx-coroutines-io-jvm-0.1.1.jar
你必须知道的5个JVM命令行标志 解压密码 www.jiangyea.com
- **定义选项**:使用 OptionBuilder 或者 Option 类来创建所需的命令行选项。 - **创建解析器**:选择合适的 CommandLineParser 实例。 - **解析命令行**:调用解析器的 parse 方法,传入程序的命令行参数数组。...
《Ant与Eclipse集成:JVM1.2版本1.0的jar.zip包解析》 在软件开发领域,Ant和Eclipse是两个重要的工具。Ant是Apache软件基金会下的一个Java项目,它是一个基于XML的构建工具,常用于自动化Java项目的构建、测试和...
nginx_upstream_jvm_route 是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。 安装方法(进入Nginx源码目录): #patch -p0 < /path/to/this/directory/jvm_route.patch # ./configure -...
"nginx-upstream-jvm-route-0.1.tar.gz"正是为了解决这个问题而设计的一个解决方案。 首先,让我们了解一下Nginx的Upstream模块。Upstream模块允许Nginx将接收到的请求转发到一组后端服务器,可以根据配置的策略...
JVM 的运行机制 多线程 JVM 的内存区域 JVM 会创建操作系统的接口创建一个原生线程。JVM 线程和操作系统线程是一一对应的
为了监控和调试JVM的运行状态,Oracle提供了多个命令行工具,包括jps、jstack、jstat、jmap和jcmd。这些工具可以帮助开发者了解和解决性能问题,优化应用程序。 一、jps (Java Process Status) jps是查看当前系统中...
Java虚拟机(JVM)内存模型是Java程序运行的基础,它包括了多个区域,如堆内存、栈内存、方法区、程序计数器以及本地方法栈。这些区域各自承担着不同的职责,确保Java应用程序能够正常执行。 1. JVM整体结构及内存...
本文主要探讨了五个不常为人知但对性能调优至关重要的JVM命令行标志。 1. **-XX:+DisableExplicitGC**:这个标志用于禁止应用程序中显式调用`System.gc()`。通常情况下,显式调用垃圾收集器是一种反模式,因为它...
在"library-template-jvm"的文件列表中,"library-template-jvm-master"很可能是项目的主分支或者根目录。在这个目录下,我们可以期待找到如`src/main/kotlin`这样的源代码目录,这里包含了库的主要代码;`src/test/...
JVM调优总结 -Xms -Xmx -Xmn -Xss JVM 调优是 Java virtual machine 的性能优化,通过调整 JVM 的参数来提高 Java 应用程序的性能。其中,-Xms、-Xmx、-Xmn、-Xss 是四个重要的参数,分别控制 JVM 的初始堆大小、...
【搭建命令行编译环境】是Java开发的基础步骤,尤其对于初学者而言至关重要。本课时主要讲解如何在命令行环境中配置Java开发工具(JDK),并编译运行首个Java程序。 首先,JDK(Java Development Kit)是开发Java...
Kotlin-Reflect-Tools-For-JVM Related Project: Kotlin-Reflect-Tools-For-Android OverView This is a tool library for Kotlin to use java reflect APIs in Kotlin simply method.It can modify or read the top...
使用MAT时,首先需要获取Java应用的堆转储文件,这通常可以通过JVM的命令行选项`-XX:+HeapDumpOnOutOfMemoryError`或者`jmap`工具来实现。然后在MAT中打开堆转储文件,通过以上提到的各种视图和报告,深入分析并解决...
kotlin-logging-jvm-2.1.21.jar