当我们打开java的按照路径,我们会在JAVA_HOME/bin/下发现jdk已经 捆绑了许多工具。毫无疑问,java.exe和javac.exe被所有的java开发者使用,也是最受欢迎的两个工具。但是其中的大部分工具对于普通的开发者来说,很少被临幸了。但是如果我们有效的使用这些工具,将会大大缩减我们的开发时间。
以下是对java se 8JDK的工具们的一个合影,作为一枚爪哇人 ,我觉得我们都应该去了解他们一下,(至于翻不翻牌去临幸它们应人而异了)。
以下5个工具,我觉得是在众多工具中比较鹤立鸡群的。
- javap
- jvisualvm
- jcmd
- jhat
- Oracle Java Mission Control
1.javap
作为一个java字节码反编译工具。下面我们编译一下hello.java,并将它反编译。
public class Hello
{
public static void main(String[] args){
System.out.println("hello world!");
}
}
当我们直接使用javap而不带任何附加参数时输入以下内容:默认会打印java类的包名、共有和保护的字段与方法。
E:\>javap Hello
Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
public static void main(java.lang.String[]);
}
如果我们对javap添加-c参数,我们将会得到该java类的包含jvm指令的信息。
E:\>javap -c Hello
Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3; //String hello world!
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
2、jvisualvm
jvisualvm是java虚拟机的监控和分析工具。它提供了一个图形化接口和java应用程序可视化的运行时信息。它本质上是使用jmap、jinfo、jstat、jstack、JConsole等来收集和分析数据。jvisualvm是跟随JDK6update7一块发布。现在又很多的插件可以继承到jvisualvm上,来让它功能更加强大。当我们的java应用程序遇到性能问题,jvisualvm便可大显身手。
3.jcmd
jcmd被用做向jvm发送诊断命令请求,当我们直接运行jcmd而不附加任何参数,它默认会显示当前正在运行的JVM 进程。它等价于jps工具。
4.jhat
jhat是一个java堆的分析工具。它被用于解析和浏览java堆的dump文件。jhat能够解析java 堆dump信息并启动一个web服务。然后我们就可以通过浏览器来浏览java堆的dump信息。jhat支持对象查询语言(Object query language)和一些pre-designed 查询。
使用jmap来生成java堆的dump信息(即java应用程序的堆快照和对象统计信息),我们需要使用-dump选项。
jmap的选项:
C:\Users\Administrator>jmap
Usage:
jmap -histo <pid>
(to connect to running process and print histogram of java object heap
jmap -dump:<dump-options> <pid>
(to connect to running process and dump java heap)
dump-options:
format=b binary default
file=<file> dump heap to <file>
Example: jmap -dump:format=b,file=heap.bin <pid>
以下是使用jmap生成pid为796的java程序的对象统计信息: 从输出我们可以看到内存中的实例数量和合计。
C:\Users\Administrator>jmap -histo 796 > E:/1.txt
num #instances #bytes class name
----------------------------------------------
1: 51249 6694928 <constMethodKlass>
2: 33095 4723304 [C
3: 84538 4457792 <symbolKlass>
4: 51249 4104960 <methodKlass>
5: 4563 2661744 <constantPoolKlass>
6: 4563 1922624 <instanceKlassKlass>
7: 3683 1542688 <constantPoolCacheKlass>
8: 6941 1300904 [B
9: 35773 858552 java.lang.String
10: 8603 585184 [I
.... ....
jmap的另一个重要功能是获取java应用程序的当前堆快照信息
C:\Users\Administrator>jmap -dump:format=b,file=E:/2.hprof 796
Dumping heap to E:\2.hprof ...
Heap dump file created
以下是jhat可用的选项:
C:\Users\Administrator>jhat
ERROR: No arguments supplied
Usage: jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
-J<flag> Pass <flag> 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 <port>: Set the port for the HTTP server. Defaults to 7000
-exclude <file>: Specify a file that lists data members that should
be excluded from the reachableFrom query.
-baseline <file>: 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 <int>: 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
<file> The file to read
For a dump file that contains multiple heap dumps,
you may specify which dump in the file
by appending "#<number>" to the file name, i.e. "foo.hprof#3".
All boolean options default to "true"
现在我们可以用jhat来分析jmap导出的java应用程序堆快照信息:
C:\Users\Administrator>jhat E:/2.hprof
Reading from E:/2.hprof...
Dump file created Fri Nov 21 15:27:10 CST 2014
Snapshot read, resolving...
Resolving 213174 objects...
Chasing references, expect 42 dots..........................................
Eliminating duplicate references..........................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
解析完成后,我们可以再浏览器中输入:http://127.0.0.1:7000/来查看分析结果。
5.Oracle Java Mission Control
Java Mission Control是随同java JDK 7 update 40一同发布,同一了Hotspot、JRockit VMs,现在JRockit Mission Control也可以在标准的Java SE 中使用。但是目前只是开发和评估时free的,要是生产使用还是需要购买Oracle的license。
Java Mission Control是同Java Flight Recorder一同工作的。可以同Hotspot VM一同工作并记录关键的数据和事件,一旦出现问题,这些数据可以用来分析问题。
启动Java Mission Control 工具利用指令jmc