jps
-
USAGE:
jps [-help] jps [-q] [-mlvV] [<hostid>]
-
OPTION
-
-q
: 只输出进程id,不输出名称 -
-m
: 查看传递给main函数的参数 -
-l
: 输出main函数所在类的完整包名或jar路径 -
-v
: 显示传递给虚拟机的参数 -
-V
: 输出通过flag文件传递到JVM中的参数 -
-Joption
: 传递参数给JVM,例如-J-Xms48m
-
<hostid>
: 指定主机
-
jstat
DESCRIPTION: 查看JVM运行时的统计信息
-
USAGE:
jstat -help|-options jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
-
EXPLANATION:
-
-options
: 下文提到的参数 -
vmid
: 通过jps
命令查出的进程id
-
-
OPTION
-
-statOption
-class
: 显示ClassLoader相关的统计信息-compiler
: 显示JIT编译器的统计信息-gc
: 显示GC相关堆的统计信息-gccapacity
: 显示各个代的容量以及使用情况-gccause
: 显示垃圾收集的相关统计信息(同-gcutil
),以及最近一次垃圾收集的诱发原因-gcnew
: 显示新生代相关信息-gcnewcapacity
: 显示新生代大小和使用情况-gcold
: 显示老年代和元空间/永久区的相关信息-gcoldcapacity
: 显示老年代的大小-gcmetacapacity
: 显示元空间/永久区的大小-gcutil
: 显示垃圾收集的相关统计信息-printcompilation
: 显示编译行为的统计信息
-t
: 在第一行显示一个Timestamp列表明程序的运行时间-h
: 在周期性输出数据时, 多少行以后输出一行表头信息interval
: 指定输出统计数据的时间周期, 单位为[s|ms]
count
: 指定一共输出多少次数据
-
-
EXAMPLE
- 每1秒输出一次ClassLoader统计信息, 每5行打印一次表头, 总共输出10次
- 输入:
jstat -class -t -h5 14927 1s 10
- 输出:
Timestamp Loaded Bytes Unloaded Bytes Time 56.3 394 817.2 0 0.0 0.04 57.3 394 817.2 0 0.0 0.04 58.3 394 817.2 0 0.0 0.04 59.3 394 817.2 0 0.0 0.04 60.3 394 817.2 0 0.0 0.04 Timestamp Loaded Bytes Unloaded Bytes Time 61.3 394 817.2 0 0.0 0.04 62.3 394 817.2 0 0.0 0.04 63.3 394 817.2 0 0.0 0.04 64.3 394 817.2 0 0.0 0.04 65.3 394 817.2 0 0.0 0.04
jinfo
DESCRIBE: 查看JAVA进程的配置信息, 包括Java系统属性以及JVM命令行参数, 对于查找JVM默认参数十分有用, 在64-bit的JVM上使用需要使用
-J-d64
选项, 例如:jinfo -J-d64 -sysprops 14607
-
USAGE:
jinfo [option] <pid> (to connect to running process) jinfo [option] <executable <core=""> (to connect to a core file) jinfo [option] [server_id@]<remote server="" ip="" or="" hostname=""> (to connect to remote debug server)</remote></executable></pid>
-
OPTION
no-option
以键值对的形式打印Java系统属性以及JVM命令行参数-flag name
打印指定的JVM命令行参数的键值对-flag [+|-]name
设定指定JVM命令行参数的布尔值-flag name=value
设定指定JVM命令行参数的值-flags
以键值对的形式打印JVM命令行参数-sysprops
以键值对的形式打印**Java系统属性
-
EXAMPLE
jinfo flag PrintGCDetails 24984 # 显示JVM是否有打印GC日志 -XX:-PrintGCDetails # 没有打印GC日志 jinfo -flag PrintGCDetails 21286 # 修改JVM参数, 使之打印GC日志
-
ATTENTION
- jinfo支持修改部分JVM参数并立即生效, 但并不是所有的参数都支持动态修改
jmap
DESCRIBE: 导出java堆dump文件, 查看堆内对象的统计信息, 查看堆内对象实例统计信息, 查看Classloader信息以及finalizer队列信息;在64-bit的JVM上使用需要使用
-J-d64
选项, 例如:jmap -J-d64 -heap pid
-
USAGE:
jmap [option] <pid> (to connect to running process) jmap [option] <executable <core> (to connect to a core file) jmap [option] [server_id@]<remote server IP or hostname> (to connect to remote debug server)
-
OPTION
<no option>
: 没有指定选项时, 会输出所有共享的对象映射; 包括开始地址, 映射大小, 全路径-dump:[live,]format=b, file=filename
: 将当前Java堆的快照以hprof二进制格式输出到filename文件中;live
选项是可选的, 但如果指定了, 只有活动的对象会被记录到快照中; 可以使用jhat
,Visual VM
,MAT
等工具查看得到的快照文件-finalizerinfo
: 打印正在等待释放(在finalizer队列中)的对象的信息-heap
: 查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况; 另外, String常量池的使用情况也会被打印出来-histo[:live]
: 打印堆信息的统计直方图; 对于每个Java类, 会打印他们的类名, 对象数量, 内存占用等信息; JVM内部的类会以星号作为前缀打印, 如果带上live选项则只统计活对象-clstats
: 打印类的统计信息-F
: 强制选项, 当使用jmap -dump
或jmap -histo
命令, 目标进程没有响应时可使用-F
选项, 这种情况下live
选项将不被支持
-
EXAMPLE
jmap -J-d64 -histo:live 25530 num #instances #bytes class name ---------------------------------------------- 1: 998 85592 [C 2: 459 52512 java.lang.Class 3: 504 25120 [Ljava.lang.Object; 4: 8 24984 [B 5: 987 23688 java.lang.String 6: 79 5688 java.lang.reflect.Field 7: 256 4096 java.lang.Integer 8: 113 3616 java.util.Hashtable$Entry 9: 90 3600 java.lang.ref.SoftReference
jhat
DESCRIPTION: JDK自带的堆分析分析工具,
jhat
命令可以对Java堆快照文件进行分析, 它启动一个HTTP服务器, 开发人员可以通过浏览器查看分析结果-
USAGE:
jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
-
OPTIONS:
-J<flag>
: 直接传递参数到运行时系统, 例如:-J-mx512m
指定使用的最大堆空间为512MB-stack false
: 关闭跟踪对象分配调用堆栈-refs false
: 关闭对对象引用的跟踪-port <port>
: 设置HTTP服务器的端口, 默认值是7000
-exclude <file>
: Specify a file that lists data members that should be excluded from the reachableFrom query-baseline <file>
: 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 <int>
: 设置debug级别0
: 无debug输出1
: Debug hprof file parsing2
: Debug hprof file parsing, no server
-version
: 显示版本号-h|-help
: 显示帮助信息<file>
: 要分析的堆快照文件
jstack
DESCRIPTION: 导出应用程序的线程堆栈,
jstack
不仅能够得到线程堆栈, 还能够自动进行死锁检查, 输出找到的死锁信息-
USAGE:
jstack [-l] <pid> (to connect to running process) jstack -F [-m] [-l] <pid> (to connect to a hung process) jstack [-m] [-l] <executable> <core> (to connect to a core file) jstack [-m] [-l] [server_id@]<remote server IP or hostname> (to connect to a remote debug server)
-
OPTIONS
-F
: 在进程无响应时强制堆栈转储-l
: 会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况-m
: 不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)
jstatd
DESCRIPTION: 用于远程主机信息收集, 本质是一个RMI程序, 它的作用相当于代理服务器, 建立本地计算机与远程监控工具的通讯, jstatd将本地计算机的Java程序信息发送给远程计算机
-
USAGE
- 直接运行
jstatd
可能会出现拒绝访问异常
access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) at java.security.AccessController.checkPermission(AccessController.java:884) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.System.setProperty(System.java:792) at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)
这是因为
jstatd
没有足够的权限所致- 新建一个
jstatd.all.policy
文件, 加入以下内容
grant codebase "path/to/tools.jar" { permission java.security.Allpermission; };
- 然后使用以下命令开启
jstatd
服务器, 默认情况下jstatd
将会在1099
端口开启RMI服务
jstatd -J-Djava.security.policy=path/to/jstatd.all.policy
- 使用
jstat
,jinfo
,jmap
等工具连接远程jstatd
服务器, 如:
jstat -gcutil 460@localhost:1099 # 460是进程ID
- 直接运行
jcmd
多功能命令行
hprof
性能统计工具(嵌入代码中)
JConsole
JDK自带图形化性能监控工具
Visual VM
可视化多合一故障诊断和性能监控工具(替代命令行甚至JConsole), 支持插件, JDK7后集成于JDK中
Mission Control
来自JRockit的图形化虚拟机诊断工具
使用飞行记录器需要在程序中加上参数: -XX:+UnlockCommercialFeatures -XX:+FlightRecorder