目前,有许多工具可以绑定到java jdk上面,其中java.exe和javac.exe是每位java工程师的必 备武器,与此同时,还有许多其它java jdk工具呈现在大家眼前。大多数java程序员都没有使用过这些工具,但如果使用,它们会让你的工作事半功倍。
javap是一个java类文件反汇编程序,可以查看java编译器生成的字节码,是分析代码的一个好工具。让我们用javap来编译这段hello world代码,再分解它。
public class helloworld {
public static void main(string... args) {
system.out.println("hello world!");
}
}
c:\users\cycle\desktop>javap helloworld
我没有传递任何参数,只是运行了javap这个工具,就得到了上面这个结果。默认情况下,它会输出java类的package,protected,public字段和方法。
compiled from "helloworld.java"
public helloworld();
public static void main(java.lang.string...);
c:\users\cycle\desktop>javap -c helloworld
如果传递参数-c到javap里面,便会得到上面这个结果。这是一条非常好的信息,这样输出的指令可以帮助我们更好地了解jvm。
code:
0: aload_0
1: invokespecial #1 // method java/lang/object."":()v
4: return
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
jvisualvm是一个java虚拟机监控和分析工具,该工具提供了一个图形界面窗口,并且可以直观的了解java应用程序的运行时信息。jvisualvm集成了许多工具,比如像jmp、jinfo、jstat、jstack、jconsole等。自从jdk 6 update 7以后已经作为jdk的一部分。
jcmd主要用来把诊断命令请求发送到java jvm中,当jvm进程中没有jcmd参数列表时,jcmd就会立即运行。这相当于jps工具,我开始启动jconsole,并且把它作为参数传递到jcmd,得到如下结果,这个也可以通过进程id(pid)实现。
c:\users\cycle>jcmd jconsole vm.uptime 3344:289.977 s
vm.uptime显示了java应用程序具体运行时间。
在调试的时候,下面的参数可以用于并发锁的线程堆栈溢出。
jcmd <pid> thread.print -l
jhat的全称是java heap analysis tool。它主要是用来解析和浏览堆文件,jhat有时更像是一个可视化工具。jhat解析堆存储( heap dump)并启动一个webserver,然后用户可以在浏览器下查看堆。jhat支持对象查询语言(oql)和一些预先设计查询。oql帮助可能在
<a target="_blank" href="http://localhost:7000/oqlhelp/">http://localhost:7000/oqlhelp/</a>
jmap工具来生成堆转储,我们应该使用-dump参数,下面jhat工具可以使用的参数列表:
我给jconsole应用程序创建了一个堆转储文件,并使用以下命令来运行进程id 3344:
jmap -dump:format=b,file=heap.bin 3344
现在,堆转储文件准备就绪,运行下面命令并且会启动一个服务:
在控制台输出结果:
在浏览器中输入:http://localhost:7000/后便会出来堆转储的详细情况:
例如,还可以在http://localhost:7000/histo/查看堆内存柱状图。
作为jvm融合战略的一部分,主要用来统一hotspot、jrockit vms。目前,jrockit mission control在标准版java se中已经可以使用。java mission control(jmc)与java flight recorder一起工作,适用于hotspot jvm,用来记录核心数据和事件。它是一个调优工具,并且适用于oracle jdk。一旦出现问题,这些数据就可以用来分析。
开发者可以使用jmc命令来创建jmc工具。