每个Java开发者都应该知道的5个JDK工具
程序员文章站
2024-03-18 16:05:16
...
【编者按】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代码,再分解它。
我没有传递任何参数,只是运行了javap这个工具,就得到了上面这个结果。默认情况下,它会输出Java类的package,protected,public字段和方法。
如果传递参数-c到javap里面,便会得到上面这个结果。这是一条非常好的信息,这样输出的指令可以帮助我们更好地了解JVM。
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)实现。
VM.uptime显示了Java应用程序具体运行时间。
在调试的时候,下面的参数可以用于并发锁的线程堆栈溢出。
4.jhat
jhat的全称是Java heap analysis tool。它主要是用来解析和浏览堆文件,jhat有时更像是一个可视化工具。jhat解析堆存储( heap dump)并启动一个webserver,然后用户可以在浏览器下查看堆。jhat支持对象查询语言(oql)和一些预先设计查询。OQL帮助可能在
jmap工具来生成堆转储,我们应该使用-dump参数,下面jhat工具可以使用的参数列表:
我给jconsole应用程序创建了一个堆转储文件,并使用以下命令来运行进程id 3344:
现在,堆转储文件准备就绪,运行下面命令并且会启动一个服务:
在控制台输出结果:
在浏览器中输入: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工具。
来自: javapapers
目前,有许多工具可以绑定到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 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
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帮助可能在
引用
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"
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.
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工具。
来自: javapapers