文前说明
作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。
本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。
文中 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。 |