每个java开发者都应该知道的5个jdk工具-mile米乐体育
jdk是java语言的软件开发工具包,没有它就无法编译java程序。目前,有许许多多的jdk工具呈现在大家面前,但最常用的莫过于java.exe、javac.exe、jar等。除了这几个,还有哪些呢?本文作者joe拥有多年的java开发经验,其在博客上分享了一篇文章:5 jdk tools every java developer should know,笔者对其进行了编译,以下为译文。
目前,有许多工具可以绑定到java jdk上面,其中java.exe和javac.exe是每位java工程师的必 备武器,与此同时,还有许多其它java jdk工具呈现在大家眼前。大多数java程序员都没有使用过这些工具,但如果使用,它们会让你的工作事半功倍。
在之前的教程中,我曾介绍过 这些工具。现在,我向大家介绍其中最重要的5个工具。
1.javap
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 class helloworld { public helloworld(); public static void main(java.lang.string...); }
c:\users\cycle\desktop>javap -c helloworld
如果传递参数-c到javap里面,便会得到上面这个结果。这是一条非常好的信息,这样输出的指令可以帮助我们更好地了解jvm。
compiled from "helloworld.java" public class helloworld { public helloworld(); code: 0: aload_0 1: invokespecial #1 // method java/lang/object."":()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应用程序的运行时信息。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
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工具。