JDK中除了包含与开发密切相关的jar包外,还包含了很多非常实用的工具。在%JAVA_HOME%\bin\目录下面除了命令行工具外,还包括了几个强大的可视化工具。这些工具可以辅助我们开发、调试应用程序以及监控虚拟机状态,因此尤其是对于开发人员而言,熟练掌握这些工具非常有必要。随JDK1.8一起发布的工具如下:
 
本文中将使用jconsole和jvisualvm来监控虚拟机状态。

一 javac,java,jar三个命令的用法

1.javac命令的用法

C:\Users\michael>javac
用法: javac <options> <source files>
其中, 可能的选项包括:
-g 生成所有调试信息
-g:none 不生成任何调试信息
-g:{lines,vars,source} 只生成某些调试信息
-nowarn 不生成任何警告
-verbose 输出有关编译器正在执行的操作的消息
-deprecation 输出使用已过时的 API 的源位置
-classpath <路径> 指定查找用户类文件和注释处理程序的位置
-cp <路径> 指定查找用户类文件和注释处理程序的位置
-sourcepath <路径> 指定查找输入源文件的位置
-bootclasspath <路径> 覆盖引导类文件的位置
-extdirs <目录> 覆盖所安装扩展的位置
-endorseddirs <目录> 覆盖签名的标准路径的位置
-proc:{none,only} 控制是否执行注释处理和/或编译。
-processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认的搜索进程
-processorpath <路径> 指定查找注释处理程序的位置
-d <目录> 指定放置生成的类文件的位置
-s <目录> 指定放置生成的源文件的位置
-implicit:{none,class} 指定是否为隐式引用文件生成类文件
-encoding <编码> 指定源文件使用的字符编码
-source <发行版> 提供与指定发行版的源兼容性
-target <发行版> 生成特定 VM 版本的类文件
-version 版本信息
-help 输出标准选项的提要
-A关键字[=值] 传递给注释处理程序的选项
-X 输出非标准选项的提要
-J<标记> 直接将 <标记> 传递给运行时系统
-Werror 出现警告时终止编译
@<文件名> 从文件读取选项和文件名
C:\Users\michael>javac -X
输出非标准选项的提要:这个选项在不同的平台下面输出结果略微不同。此处省略输出。

2.java命令的用法

C:\Users\michael>java
用法: java [-options] class [args...] (执行类)
或 java [-options] -jar jarfile [args...] (执行 jar 文件)
其中选项包括:
-d32 使用 位数据模型 (如果可用)
-d64 使用 位数据模型 (如果可用)
-server 选择 "server" VM
默认 VM 是 server. -cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>
用 ; 分隔的目录, JAR 档案和 ZIP 档案列表, 用于搜索类文件。
-D<名称>=<值>
设置系统属性
-verbose:[class|gc|jni]
启用详细输出
-version 输出产品版本并退出
-version:<值>
需要指定的版本才能运行
-showversion 输出产品版本并继续
-jre-restrict-search | -no-jre-restrict-search
在版本搜索中包括/排除用户专用 JRE
-? -help 输出此帮助消息
-X 输出非标准选项的帮助
-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
按指定的粒度启用断言
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
禁用具有指定粒度的断言
-esa | -enablesystemassertions
启用系统断言
-dsa | -disablesystemassertions
禁用系统断言
-agentlib:<libname>[=<选项>]
加载本机代理库 <libname>, 例如 -agentlib:hprof
另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
-agentpath:<pathname>[=<选项>]
按完整路径名加载本机代理库
-javaagent:<jarpath>[=<选项>]
加载 Java 编程语言代理, 请参阅 java.lang.instrument
-splash:<imagepath>
使用指定的图像显示启动屏幕有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。 C:\Users\michael>java -X
-Xmixed 混合模式执行 (默认)
-Xint 仅解释模式执行
-Xbootclasspath:<用 ; 分隔的目录和 zip/jar 文件>
设置搜索路径以引导类和资源
-Xbootclasspath/a:<用 ; 分隔的目录和 zip/jar 文件>
附加在引导类路径末尾
-Xbootclasspath/p:<用 ; 分隔的目录和 zip/jar 文件>
置于引导类路径之前
-Xdiag 显示附加诊断消息
-Xnoclassgc 禁用类垃圾收集
-Xincgc 启用增量垃圾收集
-Xloggc:<file> 将 GC 状态记录在文件中 (带时间戳)
-Xbatch 禁用后台编译
-Xms<size> 设置初始 Java 堆大小
-Xmx<size> 设置最大 Java 堆大小
-Xss<size> 设置 Java 线程堆栈大小
-Xprof 输出 cpu 配置文件数据
-Xfuture 启用最严格的检查, 预期将来的默认值
-Xrs 减少 Java/VM 对操作系统信号的使用 (请参阅文档)
-Xcheck:jni 对 JNI 函数执行其他检查
-Xshare:off 不尝试使用共享类数据
-Xshare:auto 在可能的情况下使用共享类数据 (默认)
-Xshare:on 要求使用共享类数据, 否则将失败。
-XshowSettings 显示所有设置并继续
-XshowSettings:all
显示所有设置并继续
-XshowSettings:vm 显示所有与 vm 相关的设置并继续
-XshowSettings:properties
显示所有属性设置并继续
-XshowSettings:locale
显示所有与区域设置相关的设置并继续 -X 选项是非标准选项, 如有更改, 恕不另行通知。

3.jar命令的用法

C:\Users\michael>jar
用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项包括:
-c 创建新的归档文件
-t 列出归档目录
-x 从档案中提取指定的 (或所有) 文件
-u 更新现有的归档文件
-v 在标准输出中生成详细输出
-f 指定归档文件名
-m 包含指定清单文件中的清单信息
-e 为捆绑到可执行 jar 文件的独立应用程序
指定应用程序入口点
- 仅存储; 不使用情况任何 ZIP 压缩
-M 不创建条目的清单文件
-i 为指定的 jar 文件生成索引信息
-C 更改为指定的目录并包含其中的文件
如果有任何目录文件, 则对其进行递归处理。清单文件名, 归档文件名和入口点名称的指定顺序与 'm', 'f' 和 'e' 标记的指定顺序相同。 示例 : 将两个类文件归档到一个名为 classes.jar 的归档文件中:
jar cvf classes.jar Foo.class Bar.class
示例 : 使用现有的清单文件 'mymanifest' 并
将 foo/ 目录中的所有文件归档到 'classes.jar' 中:
jar cvfm classes.jar mymanifest -C foo/ . C:\Users\michael>jar cvf tp.jar TimePrinter.class 【注:没有指定应用程序入口,所以该jar包无法执行】
已添加清单
正在添加: TimePrinter.class(输入 = ) (输出 = )(压缩了 %) C:\Users\michael>java -jar tp.jar
tp.jar中没有主清单属性 C:\Users\michael>jar cvfe tp.jar TimePrinter TimePrinter.class 【注:选项cvfe中添加了e,TimePrinter为主类】
已添加清单
正在添加: TimePrinter.class(输入 = ) (输出 = )(压缩了 %) C:\Users\michael>java -jar tp.jar
Fri Apr :: CST
Fri Apr :: CST

二 编译并运行测试程序

该测试程序的功能是每隔一秒向控制台输出当前时间,TimePrinter.java 源码如下:

public class TimePrinter {
public static void main(String[] args) throws Exception{
for(int i = 0;i< 1000;i++){
System.out.println(new java.util.Date());
Thread.sleep(1000);
}
}
}

1. 编译源文件

C:\Users\michael>javac -verbose TimePrinter.java
[解析开始时间 RegularFileObject[TimePrinter.java]]
[解析已完成, 用时 47 毫秒]
[源文件的搜索路径: .]
[类文件的搜索路径: C:\Program Files\Java\jdk1.7.0_51\jre\lib\resources.jar,C:\Program Files\...
[正在加载ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_51\lib\ct.sym(META-INF/sym/rt.jar/java/lang/String.class)]]
...
[正在检查TimePrinter]
[正在加载ZipFileIndexFileObject[C:\Program Files\Java\jdk1.7.0_51\lib\ct.sym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]]
...
[已写入RegularFileObject[TimePrinter.class]]
[共 920 毫秒]

2.设置VM参数并运行程序

(1)class方式运行

C:\Users\michael>java -Xms20m -Xmx20m -Xmn10m TimePrinter
Fri Apr 10 09:42:43 CST 2015
Fri Apr 10 09:42:44 CST

(2)jar方式运行

C:\Users\michael>java -Xms20m -Xmx20m -Xmn10m -jar tp.jar
Fri Apr :: CST
Fri Apr :: CST

注:Eclipse下选择Run->Run Configurations设置VM运行参数,如下图:

当然还可以设置更多的参数,比如:

C:\Users\michael>java -Xms200M -Xmx200M -Xmn100M -Xss100M -XX:PermSize=100M -XX:MaxPermSize=100M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1 TimePrinter
注意:有的选项带值:-XX:SurvivorRatio=8 ;有的是带加减号,比如-XX:+PrintGCDetails .(带加减号的话,估计就是true或false的意思)

三 用jconsole监控运行状态

1.我们计划将堆的总太小设为20M,新生代和老年代各10M。由于默认情况下survivor和eden的空间比例是1:8,所以Eden大约8M,2个survivor各自1M。下面验证一下jconsole的监控情况和我们的计划是否一致。

(1)堆的总大小:

(2)老年代大小:

(3)Eden大小:

(4)survivor大小:

结果:符合预期计划。

2.其他信息

3.缺点:jconsole会对被监控程序的正常运行产生影响。

就本测试程序而言,当运行jconsole程序监控TimePrinter程序时,会发现TimePrinter会输出一些额外的类加载信息,从侧面说明了TimePrinter会额外加载部分类以支持jconsole的工作。

四 用jvisualvm监控运行状态

和jconsole相比,jvisualvm的线程可视化做得很好。而且jvisualvm还有一个很大的优点:不需要被监视的程序基于特殊Agent运行,因此它对于应用程序的实际性能影响很小。jvisualvm是Oracle力推的工具,以后主要就用它了。

JVM学习笔记:虚拟机性能监控的更多相关文章

  1. 深入理解JVM(③)虚拟机性能监控、故障处理工具

    前言 JDK的bin目录中有一系列的小工具,除了java.exe.javac.exe这两个编译和运行Java程序外,还有打包.部署.签名.调试.监控.运维等各种场景都会用到这些小工具. 这些工具根据软 ...

  2. JVM学习总结五——性能监控及故障处理工具

    之前扯了四篇理论,这一篇终于可以动动手了.本篇我们将介绍JVM常用的一些工具,这些工具将是我们监控JVM状态.处理故障和调优分析的利器. 不过在开始之前,我还是要先车扯两句:工具终归只是帮助我们我们处 ...

  3. 【JVM.3】虚拟机性能监控与故障处理工具

    一.概述 经过前面两章对于虚拟机内存分配与回收技术各方面的介绍,相信读者已经建立了一套比较完整的理论基础.理论总是作为指导实践的工具,能把这些执行应用到实际工作中才是我们的最终目的.接下来我们会从实践 ...

  4. JVM学习笔记:虚拟机的类加载机制

    JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...

  5. 【Java虚拟机】JVM学习笔记之GC

    JVM学习笔记二之GC GC即垃圾回收,在C++中垃圾回收由程序员自己来做,例如可以用free和delete来回收对象.而在Java中,JVM替程序员来执行垃圾回收的工作,下面看看GC的详细原理和执行 ...

  6. JVM学习笔记-第七章-虚拟机类加载机制

    JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被 ...

  7. JVM学习笔记-第三章-垃圾收集器与内存分配策略

    JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...

  8. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  9. JVM 学习笔记记录

    JVM 学习笔记记录 Sun JDK 监控和故障处理工具 名称 主要作用 jps JVM Process Status Tool, 显示指定系统内所有的HotSpot虚拟机进程 jstat JVM S ...

  10. JVM学习笔记-第六章-类文件结构

    JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...

随机推荐

  1. mysql 判断 字段是否为空

    SB.Append("select "); SB.Append("mpe.EVIDENCE_ID "); SB.Append("left join m ...

  2. WEBAPI 怎么保证安全

    先记录下   客户端登陆,服务端验证然后生成session,客户端每次调用接口的时候都把session带过去.服务端路由请求的时候都去验证session. 另外一种app的做法是,参数+用户名密码做s ...

  3. Apache Rewrite 拟静态配置

    1.mod_rewrite 简介和配置 Rewirte主要的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 2.mod_ ...

  4. ASP.NET MVC使用jQuery来POST数据至数据库中

    学习ASP.NET MVC程序,结合jQuery客户端代码,Post数据至数据库去.Insus.NET今天写一个完整性的例子. 在数据库中,创建一个表[dbo].[TestUser]: 既然是把数据存 ...

  5. 苹果iPhone如何区分港版、国行、水货

    要想分辨所购买的苹果产品[iPhone 4.iPod Touch.iPad 2.iMac.MacBook及iPhone 4S]是大陆行货.水货.港货还是其它,其实很简单.今天来教大家如何区分.大陆行货 ...

  6. 程序开发使用docker部署

    我们公司自己研发了一套 grand-line 系统,使用 docker 来部署项目. 我是第一批小白鼠,一开始网络差,build 一次要半个小时,连接进入 web shell 也很慢,部署一个微信项目 ...

  7. 判断 JS 中对象的类型

    1.typeof 形如 var x = "xx"; typeof x == 'string' typeof(x) 返回类型有:'undefined' “string” 'numbe ...

  8. 求解最大矩形面积 — leetcode 85. Maximal Rectangle

    之前切了道求解最大正方形的题,题解猛戳 这里.这道题 Maximal Rectangle 题意与之类似,但是解法完全不一样. 先来看这道题 Largest Rectangle in Histogram ...

  9. Servicestack IRequestLogger获取 IHttpRequest

    我在 ServiceStack里实现了 Logging 中的请求与返回,同时我想在IRequestLogger.Log() 方法中获取 IHttpRequest . IRequestContext 并 ...

  10. [CF#286 Div2 D]Mr. Kitayuta's Technology(结论题)

    题目:http://codeforces.com/contest/505/problem/D 题目大意:就是给你一个n个点的图,然后你要在图中加入尽量少的有向边,满足所有要求(x,y),即从x可以走到 ...