JDK 部分内置工具使用

文前说明

作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。

文中 JDK 版本为 1.7.0_91

以下使用到 pid 的工具,必须具有访问此 pid 的权限。

可以采用 sudo -u user 工具名 来运行工具。

工具名称 描述
appletviewer 用于运行并浏览applet小程序。
apt 注解处理工具(Annotation Processing Tool),主要用于注解处理。
extcheck 扩展检测工具,主要用于检测指定jar文件与当前已安装的Java SDK扩展之间是否存在版本冲突。
idlj IDL转Java编译器(IDL-to-Java Compiler),用于为指定的IDL文件生成Java绑定。IDL意即接口定义语言(Interface Definition Language)。
jabswitch Java访问桥开关(Java Access Bridge switch),用于启用/禁用Java访问桥。Java访问桥内置于Java 7 Update 6及以上版本,主要为Windows系统平台提供一套访问Java应用的API。
jar jar文件管理工具,主要用于打包压缩、解压jar文件。
jarsigner jar密匙签名工具。
java Java运行工具,用于运行.class字节码文件或.jar文件。
javac Java编译工具(Java Compiler),用于编译Java源代码文件。
javadoc Java文档工具,主要用于根据Java源代码中的注释信息生成HTML格式的API帮助文档。
javafxpackager JavaFX包装器,用于执行与封装或签名JavaFX应用有关的任务。
javah Java头文件工具,用于根据Java类生成C/C++头文件和源文件(主要用于JNI开发领域)。
javap Java反编译工具,主要用于根据Java字节码文件反汇编为Java源代码文件。
java-rmi Java远程方法调用(Java Remote Method Invocation)工具,主要用于在客户机上调用远程服务器上的对象。
javaw Java运行工具,用于运行.class字节码文件或.jar文件,但不会显示控制台输出信息,适用于运行图形化程序。
javaws Java Web Start,使您可以从Web下载和运行Java应用程序,下载、安装、运行、更新Java应用程序都非常简单方便。
jcmd Java 命令行(Java Command),用于向正在运行的JVM发送诊断命令请求。
jconsole 图形化用户界面的监测工具,主要用于监测并显示运行于Java平台上的应用程序的性能和资源占用等信息。
jdb Java调试工具(Java Debugger),主要用于对Java应用进行断点调试。
jhat Java堆分析工具(Java Heap Analysis Tool),用于分析Java堆内存中的对象信息。
jinfo Java配置信息工具(Java Configuration Information),用于打印指定Java进程、核心文件或远程调试服务器的配置信息。
jmap Java内存映射工具(Java Memory Map),主要用于打印指定Java进程、核心文件或远程调试服务器的共享对象内存映射或堆内存细节。
jmc Java任务控制工具(Java Mission Control),主要用于HotSpot JVM的生产时间监测、分析、诊断。
jps JVM进程状态工具(JVM Process Status Tool),用于显示目标系统上的HotSpot JVM的Java进程信息。
jrunscript Java命令行脚本外壳工具(command line script shell),主要用于解释执行javascript、groovy、ruby等脚本语言。
jsadebugd Java可用性代理调试守护进程(Java Serviceability Agent Debug Daemon),主要用于附加到指定的Java进程、核心文件,或充当一个调试服务器。
jstack Java堆栈跟踪工具,主要用于打印指定Java进程、核心文件或远程调试服务器的Java线程的堆栈跟踪信息。
jstat JVM统计监测工具(JVM Statistics Monitoring Tool),主要用于监测并显示JVM的性能统计信息。
jstatd jstatd(VM jstatd Daemon)工具是一个RMI服务器应用,用于监测HotSpot JVM的创建和终止,并提供一个接口,允许远程监测工具附加到运行于本地主机的JVM上。
jvisualvm JVM监测、故障排除、分析工具,主要以图形化界面的方式提供运行于指定虚拟机的Java应用程序的详细信息。
keytool 密钥和证书管理工具,主要用于密钥和证书的创建、修改、删除等。
kinit 主要用于获取或缓存Kerberos协议的票据授权票据。
klist 允许用户查看本地凭据缓存和密钥表中的条目(用于Kerberos协议)。
ktab Kerberos密钥表管理工具,允许用户管理存储于本地密钥表中的主要名称和服务密钥。
native2ascii 本地编码到ASCII编码的转换器(Native-to-ASCII Converter),用于"任意受支持的字符编码"和与之对应的"ASCII编码和(或)Unicode转义"之间的相互转换。
orbd 对象请求代理守护进程(Object Request Broker Daemon),它使客户端能够透明地定位和调用位于CORBA环境的服务器上的持久对象。
pack200 JAR文件打包压缩工具,它可以利用Java类特有的结构,对普通JAR文件进行高效压缩,以便于能够更快地进行网络传输。
packager 这是微软提供的对象包装程序,用于对象安装包。
policytool 策略工具,用于管理用户策略文件(.java.policy)。
rmic Java RMI 编译器,为使用JRMP或IIOP协议的远程对象生成stub、skeleton、和tie类,也用于生成OMG IDL。
rmid Java RMI 激活系统守护进程,rmid启动激活系统守护进程,允许在虚拟机中注册或激活对象。
rmiregistry Java 远程对象注册表,用于在当前主机的指定端口上创建并启动一个远程对象注册表。
schemagen XML schema生成器,用于生成XML schema文件。
serialver 序列版本命令,用于生成并返回serialVersionUID。
servertool Java IDL 服务器工具,用于注册、取消注册、启动和终止持久化的服务器。
tnameserv Java IDL瞬时命名服务。
unpack200 JAR文件解压工具,将一个由pack200打包的文件解压提取为JAR文件。
wsgen XML Web Service 2.0的Java API,生成用于JAX-WS Web Service的JAX-WS便携式产物。
wsimport XML Web Service 2.0的Java API,主要用于根据服务端发布的wsdl文件生成客户端存根及框架
xjc 主要用于根据XML schema文件生成对应的Java类。

JVM进程状态工具(JVM Process Status Tool)

  • 列出 Java 进程,类似于 ps 命令。

  • 参数 -q 可以指定 jps 只输出进程 ID,不输出类的短名称。

  • 参数 -m 可以用于输出传递给 Java 进程(主函数)的参数。

  • 参数 -l 可以用于输出主函数的完整路径。

  • 参数 -v 可以显示传递给 JVM 的参数。

  • 使用 sudo -u ovirt jps 可以显示 ovirt 用户使用的 Java 程序

1874 jboss-modules.jar -XX:+TieredCompilation -Xms1g -Xmx1g -XX:PermSize=512m -XX:MaxPermSize=512m -Djava.net.preferIPv4Stack=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djava.awt.headless=true -Djsse.enableSNIExtension=false -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/ovirt-engine/dump -Xrunjdwp:transport=dt_socket,address=192.168.96.44:8787,server=y,suspend=n -Djava.util.logging.manager=org.jboss.logmanager -Dlogging.configuration=file:///var/lib/ovirt-engine/jboss_runtime/config/ovirt-engine-logging.properties -Dorg.jboss.resolver.warning=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djboss.modules.write-indexes=false -Djboss.server.default.config=ovirt-engine -Djboss.home.dir=/usr/share/jbossas -Djboss.server.base.dir=/usr/share/ovirt-engine -Djboss.server.data.dir=/var/lib/ovirt-engine -Djboss.server.log.dir=/var/log/ovirt-engine -Djboss.server.config.dir=/var/lib/ovirt-engine/jboss_runtime/config -Djboss.server.temp.dir=/var/lib/ovirt-engine/jboss_runtime/tmp -Djbo

jps 命令实现机制如下:

Java程序启动,在 java.io.tmpdir 指定的目录下(临时文件夹)里,生成一个类似于 hsperfdata_User 的文件夹,这个文件夹里(在 Linux 中为 /tmp/hsperfdata_{userName}/)有一些文件,这些文件的名字就是 Java 进程的 pid。通过解析每个文件,就可以获得系统的参数等等。


Java堆栈跟踪工具

  • 参数 dump 输出线程信息。

  • 参数 -l 打印锁信息。

  • 参数 -m 打印 Java 和 native 的帧信息。

  • 参数 -F 强制 dump,当 jstack 没有响应时使用。

jstack 使用实例

#jstack -J-d64 [pid]

#jstack -l -F [pid]

#sudo -u ovirt jstack -J-d64 -l [pid]
"Finalizer" daemon prio=10 tid=0x00007fcda4145800 nid=0x75a in Object.wait() [0x00007fcd86af2000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
    - locked <0x00000000c72f8138> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

   Locked ownable synchronizers:
    - None

"Reference Handler" daemon prio=10 tid=0x00007fcda4143800 nid=0x759 in Object.wait() [0x00007fcd94105000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:503)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
    - locked <0x00000000c709e5c0> (a java.lang.ref.Reference$Lock)

   Locked ownable synchronizers:
    - None

"VM Thread" prio=10 tid=0x00007fcda413f000 nid=0x758 runnable 

"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007fcda4022800 nid=0x754 runnable 

"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007fcda4024000 nid=0x755 runnable 

"GC task thread#2 (ParallelGC)" prio=10 tid=0x00007fcda4026000 nid=0x756 runnable 

"GC task thread#3 (ParallelGC)" prio=10 tid=0x00007fcda4028000 nid=0x757 runnable 

"VM Periodic Task Thread" prio=10 tid=0x00007fcda4196800 nid=0x762 waiting on condition 

JNI global references: 9805
信息 说明
prio 线程的优先级
tid 线程 ID
nid 操作系统映射的线程 ID,(例如:nid=0x75a)
0x00007fcd86af2000 表示线程栈的起始地址。
0x00000000c709e5c0 锁的对象的 ID

发现 死锁 现象

Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x0003f334 (object 0x22c19f18, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x0003f314 (object 0x22c19f20, a java.lang.Object),
which is held by "Thread-1"

JVM统计监测工具(JVM Statistics Monitoring Tool)

jstat -options 可以列出当前JVM版本支持的选项

参数 作用
-class 类加载器
-compiler JIT
-gc GC堆状态
-gccapacity 各区大小
-gccause 最近一次GC统计和原因
-gcnew 新区统计
-gcnewcapacity 新区大小
-gcold 老区统计
-gcoldcapacity 老区大小
-gcpermcapacity 永久区大小
-gcutil GC统计汇总
-printcompilation HotSpot编译统计

jstat –class : 显示加载 class 的数量,及所占空间等信息。

显示列名 具体描述
Loaded 装载的类的数量
Bytes 装载类所占用的字节数
Unloaded 卸载类的数量
Bytes 卸载类的字节数
Time 装载和卸载类所花费的时间
Loaded  Bytes  Unloaded  Bytes     Time   
11109 22911.1        0     0.0      23.17

jstat -compiler :显示 VM 实时编译的数量等信息。

显示列名 具体描述
Compiled 编译任务执行数量
Failed 编译任务执行失败数量
Invalid 编译任务执行失效数量
Time 编译任务消耗时间
FailedType 最后一个编译失败任务的类型
FailedMethod 最后一个编译失败任务所在的类及方法
Compiled Failed Invalid   Time   FailedType FailedMethod
7742      2       0    52.35          1 org/jboss/msc/service/ServiceControllerImpl commitInstallation

jstat -gc : 可以显示gc的信息,查看gc的次数,及时间。

显示列名 具体描述
S0C 年轻代中第一个survivor(幸存区)的容量 (字节)
S1C 年轻代中第二个survivor(幸存区)的容量 (字节)
S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC 年轻代中Eden(伊甸园)的容量 (字节)
EU 年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC Old代的容量 (字节)
OU Old代目前已使用空间 (字节)
PC Perm(持久代)的容量 (字节)
PU Perm(持久代)目前已使用空间 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   
1536.0 1536.0 1440.0  0.0   346624.0 13441.3   699392.0   191839.2  524288.0 68606.4    188    3.933   0      0.000    3.933

jstat -gccapacity :可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小

显示列名 具体描述
NGCMN 年轻代(young)中初始化(最小)的大小(字节)
NGCMX 年轻代(young)的最大容量 (字节)
NGC 年轻代(young)中当前的容量 (字节)
S0C 年轻代中第一个survivor(幸存区)的容量 (字节)
S1C 年轻代中第二个survivor(幸存区)的容量 (字节)
EC 年轻代中Eden(伊甸园)的容量 (字节)
OGCMN old代中初始化(最小)的大小 (字节)
OGCMX old代的最大容量(字节)
OGC old代当前新生成的容量 (字节)
OC Old代的容量 (字节)
PGCMN perm代中初始化(最小)的大小 (字节)
PGCMX perm代的最大容量 (字节)
PGC perm代当前新生成的容量 (字节)
PC Perm(持久代)的容量 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC      PGCMN    PGCMX     PGC       PC     YGC    FGC 
349696.0 349696.0 349696.0 1536.0 1536.0 346624.0   699392.0   699392.0   699392.0   699392.0 524288.0 524288.0 524288.0 524288.0    188     0

jstat -gcutil :统计gc信息

显示列名 具体描述
S0 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E 年轻代中Eden(伊甸园)已使用的占当前容量百分比
O old代已使用的占当前容量百分比
P perm代已使用的占当前容量百分比
YGC 从应用程序启动到采样时年轻代中gc次数
YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
93.75   0.00  26.47  27.43  13.09    188    3.933     0    0.000    3.933

jstat -gcnew :年轻代对象的信息。

显示列名 具体描述
S0C 年轻代中第一个survivor(幸存区)的容量 (字节)
S1C 年轻代中第二个survivor(幸存区)的容量 (字节)
S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
TT 持有次数限制
MTT 最大持有次数限制
EC 年轻代中Eden(伊甸园)的容量 (字节)
EU 年轻代中Eden(伊甸园)目前已使用空间 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
1536.0 1536.0 1440.0    0.0  1  15 1536.0 346624.0 105110.3    188    3.933

jstat -gcnewcapacity :年轻代对象的信息及其占用量。

显示列名 具体描述
NGCMN 年轻代(young)中初始化(最小)的大小(字节)
NGCMX 年轻代(young)的最大容量 (字节)
NGC 年轻代(young)中当前的容量 (字节)
S0CMX 年轻代中第一个survivor(幸存区)的最大容量 (字节)
S0C 年轻代中第一个survivor(幸存区)的容量 (字节)
S1CMX 年轻代中第二个survivor(幸存区)的最大容量 (字节)
S1C 年轻代中第二个survivor(幸存区)的容量 (字节)
ECMX 年轻代中Eden(伊甸园)的最大容量 (字节)
EC 年轻代中Eden(伊甸园)的容量 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
349696.0   349696.0   349696.0 116224.0   1536.0 116224.0   1536.0   348672.0   346624.0   188     0

jstat -gcold :old代对象的信息。

显示列名 具体描述
PC Perm(持久代)的容量 (字节)
PU Perm(持久代)目前已使用空间 (字节)
OC Old代的容量 (字节)
OU Old代目前已使用空间 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)
   PC       PU        OC          OU       YGC    FGC    FGCT     GCT   
524288.0  68606.4    699392.0    191839.2    188     0    0.000    3.933

jstat -gcoldcapacity :old代对象的信息及其占用量。

显示列名 具体描述
OGCMN old代中初始化(最小)的大小 (字节)
OGCMX old代的最大容量(字节)
OGC old代当前新生成的容量 (字节)
OC Old代的容量 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
699392.0    699392.0    699392.0    699392.0   188     0    0.000    3.933

jstat -gcpermcapacity :perm对象的信息及其占用量。

显示列名 具体描述
PGCMN perm代中初始化(最小)的大小 (字节)
PGCMX perm代的最大容量 (字节)
PGC perm代当前新生成的容量 (字节)
PC Perm(持久代)的容量 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)
  PGCMN      PGCMX       PGC         PC      YGC   FGC    FGCT     GCT   
524288.0   524288.0   524288.0   524288.0   188     0    0.000    3.933

jstat -printcompilation :当前VM执行的信息。

显示列名 具体描述
Compiled 编译任务的数目
Size 方法生成的字节码的大小
Type 编译类型
Method 类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的
Compiled  Size  Type Method
7742    188    1 com/cetc/platform/tcbox/radius/AcctRadiusNioServer run

Java内存映射工具(Java Memory Map)

jmap 打印出某个java进程(使用pid)内存内的,所有‘对象’的情况

jmap -histo :显示类加载信息。

5321:             1             16  org.jboss.as.ejb3.component.stateless.StatelessComponentDescription$5
5322:             1             16  org.jboss.as.controller.SecurityActions$CallerActions$1
5323:             1             16  org.codehaus.jackson.map.deser.std.PrimitiveArrayDeserializers$CharDeser
5324:             1             16  org.jboss.as.logging.CommonAttributes$3
5325:             1             16  org.jboss.as.platform.mbean.MemoryPoolMXBeanResetPeakUsageHandler
5326:             1             16  org.jboss.as.web.WebVirtualHostAdd
5327:             1             16  org.jboss.as.server.services.net.BindingMetricHandlers$BoundPortHandler
5328:             1             16  org.jboss.as.ejb3.deployment.processors.merging.ConcurrencyManagementMergingProces

sudo -u ovirt jmap -dump:format=b,file=jmap-stack.info.bin

Dumping heap to /tmp/hsperfdata_ovirt/jmap-stack.info.bin ...
Heap dump file created

问题:

使用的 jmap 所在的 JDK 版本要和 Java 进程所使用的 JVM 中的版本一致,如 ovirt-engine 所使用的 JVM 中版本为 1.7.0.85,所以要安装 java-1.7.0-openjdk-devel-1.7.0.85-2.6.1.3.el6_7.x86_64.rpm 才能正常使用该命令。


Java配置信息工具(Java Configuration Information)

命令格式:jinfo [ options ] [ pid ]

C:\Program Files (x86)\Java\jdk1.6.0_32\bin>jinfo -flag MaxPermSize 1484
-XX:MaxPermSize=67108864

jinfo 列出所有参数。

org.quartz.jobStore.misfireThreshold = 60000
jboss.server.persist.config = true
java.vm.specification.vendor = Oracle Corporation
java.runtime.version = 1.7.0_91-mockbuild_2015_10_20_10_42-b00
javax.xml.stream.XMLEventFactory = __redirected.__XMLEventFactory
user.name = ovirt
javax.xml.stream.XMLOutputFactory = __redirected.__XMLOutputFactory
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
jboss.node.name = localhost
org.apache.coyote.http11.Http11Protocol.COMPRESSION = on
javax.xml.parsers.SAXParserFactory = __redirected.__SAXParserFactory
jboss.home.dir = /usr/share/jbossas
user.language = en
sun.boot.library.path = /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.91.x86_64/jre/lib/amd64
org.quartz.threadPool.threadCount = 100
java.util.logging.manager = org.jboss.logmanager.LogManager
java.version = 1.7.0_91
jboss.server.default.config = ovirt-engine
java.net.preferIPv4Stack = true
user.timezone = America/New_York

可以用来查看正在运行的 Java 应用程序的扩展参数,甚至支持在运行时,修改部分参数。

-flag :打印指定 JVM 的参数值

–flag [+|-]:设置指定 JVM 参数的布尔值

–flag =:设置指定 JVM 参数的值

Java堆分析工具(Java Heap Analysis Tool)

jhat 是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言

一般是先使用 jmap 命令把堆中的信息 dump 出来,然后用 jhat 进行分析:

#sudo -u ovirt jps
#sudo -u ovirt jmap -dump:format=b,file=jmap-stack.info.bin [pid]
#jhat jmap-stack.info.bin

Started HTTP server on port 7000
Server is ready.
访问 http://localhost:7000,就可以查看详细的内存信息。

有时你dump出来的堆很大,在启动时会报堆空间不足的错误,可以使用如下参数

jhat -J-Xmx512m 

Java 反编译工具

  • javap 是 JDK 自带的反汇编器,可以查看 Java 编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。

命令格式:javap [ 命令选项 ] class...

命令选项 说明
-help 输出 javap 的帮助信息。
-l 输出行及局部变量表。
-b 确保与 JDK 1.1 javap 的向后兼容性。
-public 只显示 public 类及成员。
-protected 只显示 protected 和 public 类及成员。
-package 只显示包、protected 和 public 类及成员。这是缺省设置。
-private 显示所有类和成员。
-J[flag] 直接将 flag 传给运行时系统。
-s 输出内部类型签名。
-c 输出类中各方法的未解析的代码,即构成 Java 字节码的指令。
-verbose 输出堆栈大小、各方法的 locals 及 args 数,以及class文件的编译版本
-classpath[路径] 指定 javap 用来查找类的路径。如果设置了该选项,则它将覆盖缺省值或 CLASSPATH 环境变量。目录用冒号分隔。
-bootclasspath[路径] 指定加载自举类所用的路径。缺省情况下,自举类是实现核心 Java 平台的类,位于 jrelibt.jar 和 jrelibi18n.jar 中。
-extdirs[dirs] 覆盖搜索安装方式扩展的位置。扩展的缺省位置是 jrelibext。

你可能感兴趣的:(JDK 部分内置工具使用)