JVM常用分析工具(扩展)
JVM常用分析工具(扩展)
jps
简介
用来查看所有的jvm进程,包括进程ID,进程启动的路径等。
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。
ps命令我们经常用到,这个命令主要是用来显示当前系统的进程情况。比如有哪些进程及其 id。jps命令也是一样,它的作用是显示当前系统的java进程情况及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例)以及他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。
语法
jps [-q] [-mlvV] [<hostid>]
-q 安静,只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
-m 输出传递给main 方法的参数,在嵌入式jvm上可能是null
-l (显示完整路径)
-v (显示传递给JVM的命令行参数)
-V (显示通过flag文件传递给JVM的参数)
hostid是主机id,默认localhost
例子
# jps
4214 Bootstrap
18096 jar
26423 Jps
默认显示 进程ID 和 启动类的名称。
# jps -q
4214
18096
26438
-q 只输出进程ID,而不显示出类的名称
# jps -m
4214 Bootstrap start
18096 jar
26453 Jps -m
-m 可以输出传递给 Java 进程(main 方法)的参数
# jps -l
4214 org.apache.catalina.startup.Bootstrap
18096 logmon.jar
26468 sun.tools.jps.Jps
-l 可以输出主函数的完整路径(类的全路径)。
# jps -v
4214 Bootstrap -Djava.util.logging.config.file=/usr/local/apache-tomcat-7.0.53/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms2560m -Xmx2560m -Xmn680m -Xss256k -XX:PermSize=240m -XX:MaxPermSize=240m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Djava.endorsed.dirs=/usr/local/apache-tomcat-7.0.53/endorsed -Dcatalina.base=/usr/local/apache-tomcat-7.0.53 -Dcatalina.home=/usr/local/apache-tomcat-7.0.53 -Djava.io.tmpdir=/usr/local/apache-tomcat-7.0.53/temp
18096 jar -Xms64m -Xmx64m -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8
26483 Jps -Denv.class.path=.:/usr/local/jdk/lib/dt.jar:/usr/local/jdk/lib/tools.jar -Dapplication.home=/usr/local/jdk1.7.0_55 -Xms8m
-v 可以显示传递给 Java 虚拟机的参数。
# jps -V
4214 Bootstrap
26512 Jps
18096 jar
-V 显示通过flag文件传递给JVM的参数
jinfo
简介
负责观察进程运行环境参数,包括Java System属性和JVM命令行参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息
语法
jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP
pid 进程号
executable 产生 core dump 的 java executable
core core file
remote-hostname-or-IP 主机名或ip
server-id 远程主机上的debug server的唯一id
-flags 打印命令行参数
-sysprops 打印系统属性
例子
# jinfo 4214
这个命令包含了 JDK 和 JVM 运行起来时的一些属性,4214 JAVA进程号
1 Attaching to process ID 19233, please wait...
2 Debugger attached successfully.
3 Server compiler detected.
4 JVM version is 25.151-b12
5 Java System Properties:
6
7 java.runtime.name = Java(TM) SE Runtime Environment
8 java.vm.version = 25.151-b12
9 sun.boot.library.path = /usr/local/jdk1.8.0_151/jre/lib/amd64
10 shared.loader =
11 java.vendor.url = http://java.oracle.com/
12 java.vm.vendor = Oracle Corporation
13 path.separator = :
14 file.encoding.pkg = sun.io
15 java.vm.name = Java HotSpot(TM) 64-Bit Server VM
16 java.util.logging.config.file = /usr/local/tomcat/instance3/conf/logging.properties
17 tomcat.util.buf.StringCache.byte.enabled = true
18 sun.os.patch.level = unknown
19 sun.java.launcher = SUN_STANDARD
20 user.country = US
21 user.dir = /root
22 java.vm.specification.name = Java Virtual Machine Specification
23 java.runtime.version = 1.8.0_151-b12
24 org.apache.catalina.startup.TldConfig.jarsToSkip =
25 java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
26 os.arch = amd64
27 java.endorsed.dirs = /usr/local/tomcat/endorsed
28 line.separator =
29
30 java.io.tmpdir = /usr/local/tomcat/instance3/temp
31 java.vm.specification.vendor = Oracle Corporation
32 java.util.logging.manager = org.apache.juli.ClassLoaderLogManager
33 java.naming.factory.url.pkgs = org.apache.naming
34 os.name = Linux
35 sun.jnu.encoding = UTF-8
36 java.library.path = /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
37 tomcat.util.scan.DefaultJarScanner.jarsToSkip = bootstrap.jar,commons-daemon.jar,tomcat-juli.jar,annotations-api.jar, el-api.jar,jsp-api.jar,servlet-api.jar,catalina.jar,catalina-ant.jar,catalina-ha.jar,catalina-tribes.jar,jasper.jar,j asper-el.jar,ecj-*.jar,tomcat-api.jar,tomcat-util.jar,tomcat-coyote.jar,tomcat-dbcp.jar,tomcat-jni.jar,tomcat-spdy.ja r,tomcat-i18n-en.jar,tomcat-i18n-es.jar,tomcat-i18n-fr.jar,tomcat-i18n-ja.jar,tomcat-juli-adapters.jar,catalina-jmx-r emote.jar,catalina-ws.jar,tomcat-jdbc.jar,tools.jar,commons-beanutils*.jar,commons-codec*.jar,commons-collections*.ja r,commons-dbcp*.jar,commons-digester*.jar,commons-fileupload*.jar,commons-httpclient*.jar,commons-io*.jar,commons-lan g*.jar,commons-logging*.jar,commons-math*.jar,commons-pool*.jar,jstl.jar,geronimo-spec-jaxrpc*.jar,wsdl4j*.jar,ant.ja r,ant-junit*.jar,aspectj*.jar,jmx.jar,h2*.jar,hibernate*.jar,httpclient*.jar,jmx-tools.jar,jta*.jar,log4j*.jar,mail*. jar,slf4j*.jar,xercesImpl.jar,xmlParserAPIs.jar,xml-apis.jar,junit.jar,junit-*.jar,ant-launcher.jar
38 java.class.version = 52.0
39 java.specification.name = Java Platform API Specification
40 sun.management.compiler = HotSpot 64-Bit Tiered Compilers
41 os.version = 3.10.0-693.el7.x86_64
42 user.home = /root
43 org.apache.catalina.startup.ContextConfig.jarsToSkip =
44 user.timezone = Asia/Shanghai
45 catalina.useNaming = true
46 java.awt.printerjob = sun.print.PSPrinterJob
47 file.encoding = UTF-8
48 java.specification.version = 1.8
49 catalina.home = /usr/local/tomcat
50 user.name = root
51 java.class.path = /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
52 java.naming.factory.initial = org.apache.naming.java.javaURLContextFactory
53 package.definition = sun.,java.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper.
54 java.vm.specification.version = 1.8
55 sun.arch.data.model = 64
56 sun.java.command = org.apache.catalina.startup.Bootstrap start
57 java.home = /usr/local/jdk1.8.0_151/jre
58 user.language = en
59 java.specification.vendor = Oracle Corporation
60 awt.toolkit = sun.awt.X11.XToolkit
61 java.vm.info = mixed mode
62 java.version = 1.8.0_151
63 java.ext.dirs = /usr/local/jdk1.8.0_151/jre/lib/ext:/usr/java/packages/lib/ext
64 jmagick.systemclassloader = no
65 sun.boot.class.path = /usr/local/jdk1.8.0_151/jre/lib/resources.jar:/usr/local/jdk1.8.0_151/jre/lib/rt.jar:/usr/local /jdk1.8.0_151/jre/lib/sunrsasign.jar:/usr/local/jdk1.8.0_151/jre/lib/jsse.jar:/usr/local/jdk1.8.0_151/jre/lib/jce.jar :/usr/local/jdk1.8.0_151/jre/lib/charsets.jar:/usr/local/jdk1.8.0_151/jre/lib/jfr.jar:/usr/local/jdk1.8.0_151/jre/cla sses
66 server.loader =
67 java.vendor = Oracle Corporation
68 catalina.base = /usr/local/tomcat/instance3
69 file.separator = /
70 java.vendor.url.bug = http://bugreport.sun.com/bugreport/
71 common.loader = ${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar
72 sun.io.unicode.encoding = UnicodeLittle
73 sun.font.fontmanager = sun.awt.X11FontManager
74 sun.cpu.endian = little
75 package.access = sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper.
76 sun.cpu.isalist =
77
78 VM Flags:
79 Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=33554432 -XX:MaxHeapSize=522190848 -XX:MaxNewSize=174 063616 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=11141120 -XX:OldSize=22413312 -XX:+UseCompressedClassPointers -XX:+Us eCompressedOops -XX:+UseFastUnorderedTimeStamps
80 Command line: -Djava.util.logging.config.file=/usr/local/tomcat/instance3/conf/logging.properties -Djava.util.loggin g.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -Dcatalina.base=/usr/ local/tomcat/instance3 -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/instance3/temp
jstack
简介
用来观察 jvm 中当前所有线程的运行情况和线程当前状态。
语法
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP
core 将被打印信息的core dump文件
remote-hostname-or-IP 远程debug服务的主机名或ip
server-id 唯一id,假如一台主机上多个远程debug服务
pid 需要被打印配置信息的java进程id,可以用jps查询
选项
-F 当’jstack [-l] pid’没有相应的时候强制打印栈信息
-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m 打印java和native c/c++框架的所有栈信息.
例子
# jstack -F 18096
18096 JAVA进程号
Attaching to process ID 18096, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.55-b03
Deadlock Detection:
No deadlocks found.
Thread 18105: (state = BLOCKED)
Thread 18104: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove(long) @bci=44, line=135 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove() @bci=2, line=151 (Interpreted frame)
- java.lang.ref.Finalizer$FinalizerThread.run() @bci=16, line=189 (Interpreted frame)
Thread 18103: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.Object.wait() @bci=2, line=503 (Interpreted frame)
- java.lang.ref.Reference$ReferenceHandler.run() @bci=46, line=133 (Interpreted frame)
jstat
简介
用于输出指定 java 进程的统计信息
利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler情况;可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。
语法
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
class:统计classloader的行为
compiler:统计hotspot just-in-time编译器的行为
gc:统计gc行为
gccapacity:统计堆中代的容量、空间
gccause:垃圾收集统计,包括最近引用垃圾收集的事件,基本同gcutil,比gcutil多了两列
gcnew:统计新生代的行为
gcnewcapacity:统计新生代的大小和空间
gcold:统计旧生代的行为
gcoldcapacity:统计旧生代的大小和空间
gcpermcapacity:统计永久代的大小和空间
gcutil:垃圾收集统计
printcompilation:hotspot编译方法统计
-h n 每n个样本,显示header一次
-t n 在第一列显示时间戳列,时间戳时从jvm启动开始计算
<vmid> 就是进程号
<interval> interval是监控时间间隔,单位为微妙,不提供就意味着单次输出
<count> count是最大输出次数,不提供且监控时间间隔有值的话, 就无限打印
例子
# jstat -class 4214 2000 10
(每隔2秒监控一次,一共做10次)
Loaded Bytes Unloaded Bytes Time
9197 18418. 0 0 0.0 12.49
9197 18418. 0 0 0.0 12.49
列名介绍:
Column Description
Loaded 被读入类的数量
Bytes 被读入的字节数(K)
Unloaded 被卸载类的数量
Bytes 被卸载的字节数(K)
Time 花费在load和unload类的时间
jmap
简介
用来监视进程运行中的jvm物理内存的占用情况,该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量。当系统崩溃时,jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等。
语法
jmap [option] <pid>
jmap [option] <executable <core>
jmap [option] [server_id@]<remote server IP or hostname>
-dump:format=b,file=<filename> pid # dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名
-finalizerinfo # 打印等待回收对象的信息
-heap # 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况
-histo[:live] # 打印堆的对象统计,包括对象数、内存大小等等 (因为在dump:live前会进行full gc,因此不加live的堆大小要大于加live堆的大小 )
-permstat # 打印classload类装载器和 jvm heap长久层的信息. 包含包括每个装载器的名字,活跃,地址,父装载器,和其总共加载的类大小。另外,内部String的数量和占用内存数也会打印出来.
-F # 强制,强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
-J # 传递参数给jmap启动的jvm. ,如:-J-Xms256m
例子
# jmap -heap 4214
Attaching to process ID 4214, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.55-b03
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration: # 堆配置情况
MinHeapFreeRatio = 40 # 最小堆的使用比例
MaxHeapFreeRatio = 70 # 最大堆的可用比例
MaxHeapSize = 2684354560 (2560.0MB) # 最大堆空间大小
NewSize = 713031680 (680.0MB) # 新生代分配大小
MaxNewSize = 713031680 (680.0MB) # 最大可用新生代分配大小
OldSize = 5439488 (5.1875MB) # 老年代大小
NewRatio = 2 # 新生代比例
SurvivorRatio = 8 # 新生代与suvivor的比例
PermSize = 251658240 (240.0MB) # perm区大小
MaxPermSize = 251658240 (240.0MB) # 最大可分配perm区大小
G1HeapRegionSize = 0 (0.0MB) # G1堆区大小
Heap Usage: # 堆使用情况
New Generation (Eden + 1 Survivor Space): # 新生代(伊甸区 + survior空间)
capacity = 641728512 (612.0MB) # 伊甸区容量
used = 507109064 (483.6168899536133MB) # 已经使用大小
free = 134619448 (128.38311004638672MB) # 剩余容量
79.0223676394793% used # 使用比例
Eden Space: # 伊甸区
capacity = 570425344 (544.0MB) # 伊甸区容量
used = 503156488 (479.84741973876953MB) # 伊甸区使用
free = 67268856 (64.15258026123047MB) # 伊甸区当前剩余容量
88.2072462755091% used # 伊甸区使用情况
From Space: # survior1区
capacity = 71303168 (68.0MB) # survior1区容量
used = 3952576 (3.76947021484375MB) # surviror1区已使用情况
free = 67350592 (64.23052978515625MB) # surviror1区剩余容量
5.543338551240809% used # survior1区使用比例
To Space: # survior2 区
capacity = 71303168 (68.0MB) # survior2区容量
used = 0 (0.0MB) # survior2区已使用情况
free = 71303168 (68.0MB) # survior2区剩余容量
0.0% used # survior2区使用比例
concurrent mark-sweep generation: # 老生代使用情况
capacity = 1971322880 (1880.0MB) # 老生代容量
used = 1514740296 (1444.5689163208008MB) # 老生代已使用容量
free = 456582584 (435.4310836791992MB) # 老生代剩余容量
76.83877214472345% used # 老生代使用比例
Perm Generation: # perm区使用情况
capacity = 251658240 (240.0MB) # perm区容量
used = 57814400 (55.1361083984375MB) # perm区已使用容量
free = 193843840 (184.8638916015625MB) # perm区剩余容量
22.973378499348957% used # perm区使用比例
28645 interned Strings occupying 3168232 bytes.