在之前的教程中,我曾介绍过 这些工具。现在,我向大家介绍其中最重要的5个工具。

1.javap

javap是一个Java类文件反汇编程序,可以查看Java编译器生成的字节码,是分析代码的一个好工具。让我们用javap来编译这段Hello World代码,再分解它。

  1. public class HelloWorld {
  2. public static void main(String... args) {
  3. System.out.println("Hello World!");
  4. }
  5. }

C:\Users\Cycle\Desktop>javap HelloWorld

我没有传递任何参数,只是运行了javap这个工具,就得到了上面这个结果。默认情况下,它会输出Java类的package,protected,public字段和方法。

  1. Compiled from "HelloWorld.java"
  2. public class HelloWorld {
  3. public HelloWorld();
  4. public static void main(java.lang.String...);
  5. }

C:\Users\Cycle\Desktop>javap -c HelloWorld

如果传递参数-c到javap里面,便会得到上面这个结果。这是一条非常好的信息,这样输出的指令可以帮助我们更好地了解JVM。

  1. Compiled from "HelloWorld.java"
  2. public class HelloWorld {
  3. public HelloWorld();
  4. Code:
  5. 0: aload_0
  6. 1: invokespecial #1                  // Method java/lang/Object."":()V
  7. 4: return
  8. public static void main(java.lang.String...);
  9. Code:
  10. 0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
  11. 3: ldc           #3                  // String Hello World!
  12. 5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
  13. 8: return
  14. }

2.jvisualvm

jvisualvm是一个Java虚拟机监控和分析工具,该工具提供了一个图形界面窗口,并且可以直观的了解Java应用程序的运行时信息。jvisualvm集成了许多工具,比如像jmp、jinfo、jstat、jstack、JConsole等。自从JDK 6 Update 7以后已经作为JDK的一部分。

在 Java垃圾回收监控和分析这篇文章中,我曾使用jvisualvm,大家不妨过去看看jvisualvm的使用方法。

3.jcmd

jcmd主要用来把诊断命令请求发送到Java JVM中,当JVM进程中没有jcmd参数列表时,jcmd就会立即运行。这相当于jps工具,我开始启动jconsole,并且把它作为参数传递到jcmd,得到如下结果,这个也可以通过进程id(pid)实现。

C:\Users\Cycle>jconsole

C:\Users\Cycle>jcmd JConsole help
3344:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
help

C:\Users\Cycle>jcmd JConsole VM.uptime 
3344:289.977 s

VM.uptime显示了Java应用程序具体运行时间。

在调试的时候,下面的参数可以用于并发锁的线程堆栈溢出。

jcmd <pid> Thread.print -l

4.jhat

jhat的全称是Java heap analysis tool。它主要是用来解析和浏览堆文件,jhat有时更像是一个可视化工具。jhat解析堆存储( heap dump)并启动一个webserver,然后用户可以在浏览器下查看堆。jhat支持对象查询语言(oql)和一些预先设计查询。OQL帮助可能在

http://localhost:7000/oql/ 
http://localhost:7000/oqlhelp/

jmap工具来生成堆转储,我们应该使用-dump参数,下面jhat工具可以使用的参数列表:

C:\Users\Cycle>jhat -help
Usage: jhat [-stack ] [-refs ] [-port ] [-baseline ] [-debug ] [-version] [-h|-help] -J Pass directly to the runtime system. For
example, -J-mx512m to use a maximum heap size of 512MB
-stack false: Turn off tracking object allocation call stack.
-refs false: Turn off tracking of references to objects
-port : Set the port for the HTTP server. Defaults to 7000
-exclude : Specify a file that lists data members that should
be excluded from the reachableFrom query.
-baseline : Specify a baseline object dump. Objects in
both heap dumps with the same ID and same class will
be marked as not being "new".
-debug : Set debug level.
0: No debug output
1: Debug hprof file parsing
2: Debug hprof file parsing, no server
-version Report version number
-h|-help Print this help and exit
The file to read For a dump file that contains multiple heap dumps,
you may specify which dump in the file
by appending "#" to the file name, i.e. "foo.hprof#3". All boolean options default to "true"

我给jconsole应用程序创建了一个堆转储文件,并使用以下命令来运行进程id 3344:

jmap -dump:format=b,file=heap.bin 3344

现在,堆转储文件准备就绪,运行下面命令并且会启动一个服务:

jmap -dump:format=b,file=heap.bin 3344

在控制台输出结果:

C:\Users\Cycle\Desktop>jhat heap.bin
Reading from heap.bin...
Dump file created Sun Nov 16 19:26:35 IST 2014
Snapshot read, resolving...
Resolving 641209 objects...
Chasing references, expect 128 dots..................
Eliminating duplicate references.....................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

在浏览器中输入:http://localhost:7000/后便会出来堆转储的详细情况:

例如,还可以在http://localhost:7000/histo/查看堆内存柱状图。

5.Oracle Java Mission Control

作为JVM融合战略的一部分,主要用来统一HotSpot、JRockit VMs。目前,JRockit Mission Control在标准版Java SE中已经可以使用。Java Mission Control(JMC)与Java Flight Recorder一起工作,适用于HotSpot JVM,用来记录核心数据和事件。它是一个调优工具,并且适用于Oracle JDK。一旦出现问题,这些数据就可以用来分析。

开发者可以使用jmc命令来创建JMC工具。

JDK工具的更多相关文章

  1. 三、jdk工具之jstack(Java Stack Trace)

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  2. 八、jdk工具之JvisualVM、JvisualVM之一--(visualVM介绍及性能分析示例)

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  3. 十二、jdk工具之jcmd介绍(堆转储、堆分析、获取系统信息、查看堆外内存)

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  4. 一、jdk工具之jps(JVM Process Status Tools)命令使用

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  5. 五、jdk工具之jmap(java memory map)、 mat之四--结合mat对内存泄露的分析、jhat之二--结合jmap生成的dump结果在浏览器上展示

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  6. 八、jdk工具之JvisualVM、JvisualVM之二--Java程序性能分析工具Java VisualVM

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  7. 十、jdk工具之Jdb命令(The Java Debugger)

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  8. [置顶] JDK工具(一)–Java编译器javac

    1.概述    javac.exe: Java编译器,将Java源代码转换成字节码. 2.用法    javac <选项> <源文件> (使用过程中发现,javac <源 ...

  9. JDK工具(一)–Java编译器javac

    1.概述    javac.exe: Java编译器,将Java源代码转换成字节码. 2.用法    javac <选项> <源文件> (使用过程中发现,javac <源 ...

  10. 使用JDK工具进行Java服务器应用程序故障排除

    Java性能调优指南–有关提高Java代码性能的各种技巧. 最近又学到了很多新知识,感谢优锐课老师细致地讲解,这篇博客记录下自己所学所想. 1. 介绍 在Java世界中,我们大多数人习惯于在Java应 ...

随机推荐

  1. webStorage

    1.HTML5中的本地存储概念是什么? 很多时候我们会存储用户本地信息到电脑上,例如:比方说用户有一个填充了一半的长表格,然后突然网络连接断开了,这样用户希望你能存储这些信息到本地,当网络恢复的时候, ...

  2. net.sf.json-lib maven依赖问题.

    <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</art ...

  3. 线程中t.setdaemon(), t.jion(), t.start的使用

    import threading import time def f0(): pass def f1(a1,a2): time.sleep(10) f0() ") t1 = threadin ...

  4. 02_android下单元测试

    Java的单元测试JUnit. Java程序入口是main方法.一般不在安卓程序入口 @Override protected void onCreate(Bundle savedInstanceSta ...

  5. [51nod1384]全排列

    法一:next_permutation函数,两个参数分别为起始指针和末尾指针. #include<bits/stdc++.h> using namespace std; typedef l ...

  6. JDBC编程之数据查询

    ----------------siwuxie095                             JDBC 编程之数据查询             首先下载 MySQL 的 JDBC 驱动 ...

  7. 功能:formatter 表单提交 拼接参数的形式

    datagarid的formatter属性 value: 代表当前单元格中的值.row:代表当前行.index: 代表当前行的下标. {field:'is_hot',title:'是否热门',widt ...

  8. 在PCL中如何实现点云压缩(1)

    点云由庞大的数据集组成,这些数据集通过距离.颜色.法线等附加信息来描述空间三维点.此外,点云能以非常高的速率被创建出来,因此需要占用相当大的存储资源,一旦点云需要存储或者通过速率受限制的通信信道进行传 ...

  9. 【转】Lucene不同版本中Field的Keyword、UnIndex,导致lucene 建立索引总是报错 急!!

    lucene 建立索引 总是报错 急!! http://zhidao.baidu.com/link?url=iaVs9JH4DfN6iwaWImt7VMJENWCWGGaWFGPjqhUw_jz7Fs ...

  10. rest framework 节流

    一.简单节流示例 所谓节流就是控制用户访问频率,这里分为匿名用户(非登录用户)和登录用户的限制. 匿名用户:根据其 IP 限制其频率 登录用户:IP.用户名都 OK 获取用户请求 IP:request ...