JVM学习笔记:虚拟机性能监控

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          使用 32 位数据模型 (如果可用)
    -d64          使用 64 位数据模型 (如果可用)
    -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 文件的独立应用程序
        指定应用程序入口点
    -0  仅存储; 不使用情况任何 ZIP 压缩
    -M  不创建条目的清单文件
    -i  为指定的 jar 文件生成索引信息
    -C  更改为指定的目录并包含其中的文件
如果有任何目录文件, 则对其进行递归处理。清单文件名, 归档文件名和入口点名称的指定顺序与 ‘m‘, ‘f‘ 和 ‘e‘ 标记的指定顺序相同。

示例 1: 将两个类文件归档到一个名为 classes.jar 的归档文件中:
       jar cvf classes.jar Foo.class Bar.class
示例 2: 使用现有的清单文件 ‘mymanifest‘ 并
           将 foo/ 目录中的所有文件归档到 ‘classes.jar‘ 中:
       jar cvfm classes.jar mymanifest -C foo/ .

C:\Users\michael>jar cvf tp.jar TimePrinter.class 【注:没有指定应用程序入口,所以该jar包无法执行】
已添加清单
正在添加: TimePrinter.class(输入 = 620) (输出 = 433)(压缩了 30%)

C:\Users\michael>java -jar tp.jar
tp.jar中没有主清单属性

C:\Users\michael>jar cvfe tp.jar TimePrinter TimePrinter.class 【注:选项cvfe中添加了e,TimePrinter为主类】
已添加清单
正在添加: TimePrinter.class(输入 = 620) (输出 = 433)(压缩了 30%)

C:\Users\michael>java -jar tp.jar
Fri Apr 10 09:42:43 CST 2015
Fri Apr 10 09:42:44 CST 2015

二 编译并运行测试程序

该测试程序的功能是每隔一秒向控制台输出当前时间,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 2015

(2)jar方式运行

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

注: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力推的工具,以后主要就用它了。

时间: 2024-10-10 13:56:55

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

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

一.概述 经过前面两章对于虚拟机内存分配与回收技术各方面的介绍,相信读者已经建立了一套比较完整的理论基础.理论总是作为指导实践的工具,能把这些执行应用到实际工作中才是我们的最终目的.接下来我们会从实践的角度去了解虚拟机内存管理的世界. 二.JDK的命令行工具 Java开发人员肯定都知道JDK的bin目录中的"java.exe"."javac.exe"这两个命令行工具,对并非所有程序员都了解JDK的bin目录之中其他命令行程序的作用.每逢JDK更新版本时,bin目录下

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

JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 → 解析)→ 初始化 → 使用 →  卸载. 1 加载 1.1 加载阶段要做的3件事情 通过一个类的全限定名来获取该类对应的二进制字节流. 将这个字节流所代表的静态存储结构转化为方法区的数据结构. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

虚拟机性能监控与故障排查工具介绍

本文来读书籍<深入理解java虚拟机-JVM高级特性与最佳实践>的阅读笔记,并且对虚拟机性能监控与故障排查一节做了内容整理. 关于导图中的两部分内容还是希望大家能够亲自测试体验下,在网上也有不少的文章介绍,这里摘录几篇个人认为不错的文章,供参考: jstat/jinfo/jstack/jmap命令行工具使用详细介绍 VisualVM 官网介绍及使用说明 使用 VisualVM 进行性能分析及调优 使用VisualVm监控远程Linux服务器java进程 由于在 linux 服务器上面,使用远程

JVM学习笔记-内存管理

第一章 内存分配 1. 内存区域. 方法区和堆(线程共享),程序计数器 , VM栈 和 本地方法栈(线程隔离). 1) java虚拟机栈:线程私有.描述的是java方法执行的内存模型:栈帧,用户存储 局部变量表,操作数栈,动态链接,方法出口等信息. 局部变量表在编译时即可完全确定!如果线程请求的栈深度大于 规定的深度,StackOverflowError. 2) 本地方法栈,类似. 3)堆:垃圾收集器管理的主要区域.线程共享. 4)方法区: 各个线程共享.存储:加载的类信息,常量,静态变量,即时

JVM 学习笔记

JVM  ----Java  Virtual Machine   (熟称:JAVA虚拟机),JVM 在执行JAVA程序的过程中将内容划分为若干个区域,其有各自的用途和管理机制.如下图: 1.  程序计算器(Program Counter Register)  --  是当前线程所执行字节码的行号指示器,通过改变其值来实现执行不同的代码指令.内存占用小,线程私有,支持多线程处理(多线程时,每个线程有一个独立程序计算器,已达到各自互不影响), 也正是由于这些特点,该区域是JVM规范中唯一没有规定任何

java之jvm学习笔记十三(jvm基本结构)

java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成图形,所以只要你有耐心,仔细,认真,并发挥你的想象力,这一章之后你会充满自信.当然,不是说看完本章,就对jvm了解了,jvm要学习的知识实在是非常的多.在你看完本节之后,后续我们还会来学jvm的细节,但是如果你在学习完本节的前提下去学习,再学习其他jvm的细节会事半功倍. 为了让你每一个知识点都有迹

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

JVM 学习笔记(二)

JVM 堆中几乎存放着java中所有的对象实例,在在垃圾回收前先要判断对象是否已死,这里对对象的判断主要有: 1.  引用计数法 给对象中添加一个引用计数器,每当有一个地方引用他时,计数器就加1:当引用失效时,计数器就减1.任何时间计数器为0时,对象就不可能在次使用. 2.  根搜索法 通过一系列的名为GC Roots 作为起点,从这些节点开始向下搜索,搜索走过的路径成为引用链(Reference Chain), 当一个对象到GC Roots 没有任何引用链时,则说明此对象时不可到达的. 可以作

JVM学习笔记(一)------基本结构

从Java平台的逻辑结构上来看,我们能够从下图来了解JVM: 从上图能清晰看到Java平台包括的各个逻辑模块,也能了解到JDK与JRE的差别 对于JVM自身的物理结构,我们能够从下图俯视一下: 对于JVM的学习,在我看来这么几个部分最重要: Java代码编译和运行的整个过程 JVM内存管理及垃圾回收机制 以下将这两个部分进行具体学习 JVM学习笔记(一)------基本结构,布布扣,bubuko.com

Linux学习笔记——虚拟机中安装VMware Tools

0 前言 VMware Tools是VMware虚拟机中自带的一种增强工具,只有在VMware虚拟机中安装好了VMware Tools,才能实现主机与虚拟机之间的文件共享,实现文件在虚拟机之间的复制粘贴. 最近购买了周立功的一款EasyARM开发板,作为树莓派Linux学习的补充.在虚拟机中安装了周立功提供的ubuntu镜像,总觉得在主机和PC机之间直接复制粘贴才爽,所以又安装了Vmware Tools.     [相关博文] [ Linux学习笔记--vmware plarer中安装ubunt