Java自带 JVM监控工具

Jdk工具所在默认路径

  • C:\Program Files\Java\jdk1.8.0_121\bin

常用工具

jps

  • 查看 JVM里的所有进程与状态 如 进程启动路径, 相关启动参数, 包名, pid 等等

jps -l 输出完整的包名称


C:\Program Files\Java\jdk1.8.0_121\bin>jps -l
15524
15432 org.jetbrains.jps.cmdline.Launcher
1832 sun.tools.jps.Jps
18504 org.jetbrains.jps.cmdline.Launcher
20952 org.jetbrains.jps.cmdline.Launcher
20300 com.wallet.user.api.UserApiApp

jps -m 输出所有预加载包和启动类名

C:\Program Files\Java\jdk1.8.0_121\bin>jps -m
15524
15432 Launcher D:/download/IntelliJ IDEA 2018.1.1/lib/forms_rt.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/commons-codec-1.9.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/jna.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/jna-platform.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/idea_rt.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/commons-logging-1.2.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/jdom.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/aether-dependency-resolver.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/util.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/aether-1.1.0-all.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/maven-aether-provider-3.3.9-all.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/javac2.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/platform-api.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/oro-2.0.8.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/log4j.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/slf4j-api-1.7.10.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/snappy-in-java-0.5.1.jar;D:/download/IntelliJ IDEA
18504 Launcher D:/download/IntelliJ IDEA 2018.1.1/lib/forms_rt.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/commons-codec-1.9.jar;D:/download/IntelliJ IDEA 2018.1.1/lib/jna.jar;D:/download/IntelliJ IDEA 
...
...
3592 Jps -m
20300 UserApiApp

jps -v 输出启动类名和 JVM参数


C:\Program Files\Java\jdk1.8.0_121\bin>jps -v
15524  -Xms128m -Xmx750m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Djb.vmOptionsFile=D:\download\IntelliJ IDEA 2018.1.1\bin\idea64.exe.vmoptions -Didea.jre.check=true -Dide.native.launcher=true -Didea.paths.selector=IntelliJIdea2018.1 -XX:ErrorFile=C:\Users\shawn\java_error_in_idea_%p.log -XX:HeapDumpPath=C:\Users\shawn\java_error_in_idea.hprof
19364 Jps -Denv.class.path=.;%SCALA_HOME%\bin;%SCALA_HOME%\lib\dt.jar;%SCALA_HOME%\lib\tools.jar.; -Dapplication.home=C:\Program Files\Java\jdk1.8.0_121 -Xms8m
15432 Launcher -Xmx700m -Djava.awt.headless=true -Djava.endorsed.dirs="" -Djdt.compiler.useSingleThread=true -Dpreload.project.path=D:/xampp/htdocs/java/blockchain_project/tour-guide -Dpreload.config.path=C:/Users/shawn/.IntelliJIdea2018.1/config/options -Dexternal.project.config=C:\Users\shawn\.IntelliJIdea2018.1\system\external_build_system\tour-guide.ba791c92 -Dcompile.parallel=false -Drebuild.on.dependency.change=true -Djava.net.preferIPv4Stack=true -Dio.netty.initialSeedUniquifier=-8305527491704632637 -Dfile.encoding=GBK -Duser.language=zh -Duser.country=CN -Didea.paths.selector=IntelliJIdea2018.1 -Didea.home.path=D:\download\IntelliJ IDEA 2018.1.1 -Didea.config.path=C:\Users\shawn\.IntelliJIdea2018.1\config -Didea.plugins.path=C:\Users\shawn\.IntelliJIdea2018.1\config\plugins -Djps.log.dir=C:/Users/shawn/.IntelliJIdea2018.1/system/log/build-log -Djps.fallback.jdk.home=D:/download/IntelliJ IDEA 2018.1.1/jre64 -Djps.fallback.jdk.version=1.8.0_152-release -Dio.netty.noUnsafe=true -Djava.io.tmpdir=C:/Users/shawn/.IntelliJ
...
...
20300 UserApiApp -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.profiles.active=local -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=56669 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:D:\download\IntelliJ IDEA 2018.1.1\lib\idea_rt.jar=56670:D:\download\IntelliJ IDEA 2018.1.1\bin -Dfile.encoding=UTF-8

jstack 输出线程与堆栈信息

  • 通过 jps工具查看需要监控的 pid, 然后使用 jstack <pid>命令查看指定的进程内所有线程与堆栈信息 如 线程 tid, 线程状态[WAITING (parking), TIMED_WAITING (sleeping), RUNNABLE], 以及锁相关信息

C:\Program Files\Java\jdk1.8.0_121\bin>jstack 17416
...
...
"http-nio-8181-exec-9" #74 daemon prio=5 os_prio=0 tid=0x000000001fc42000 nid=0x33c8 waiting on condition [0x0000000022fbe000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x000000079107a370> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
        at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:103)
        at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:31)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - None
...
...
Found one Java-level deadlock:
=============================
"正在等待的线程名称 t1"
  waiting for ownable synchronizer 0x000000001fc40000, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
  which is held by "持有死锁的线程名称 t2"
"正在等待的线程名称 t2"
  waiting for ownable synchronizer 0x000000001fc48000, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
  which is held by "持有死锁的线程名称 t1"
...
...
  • 查出了一个死锁信息, 可以看出相互等待互各自持有的锁

jinfo 输出环境参数和系统属性

  • 通过 jps工具查看需要监控的 pid, 然后使用 jinfo <pid>命令查看指定运行的程序, 所有环境参数和系统属性和 JVM相关信息

jmap

  • 通过 jps工具查看需要监控的 pid, 然后使用 jmap <pid>命令查看指定运行的程序, 内存相关信息

jmap -heap <pid> 输出进程内堆详细信息


C:\Program Files\Java\jdk1.8.0_121\bin>jmap -heap 20300
Attaching to process ID 20300, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 3196059648 (3048.0MB)
   NewSize                  = 67108864 (64.0MB)
   MaxNewSize               = 1065353216 (1016.0MB)
   OldSize                  = 134217728 (128.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 477102080 (455.0MB)
   used     = 442908368 (422.3903350830078MB)
   free     = 34193712 (32.60966491699219MB)
   92.83304067758414% used
From Space:
   capacity = 15728640 (15.0MB)
   used     = 8778432 (8.37176513671875MB)
   free     = 6950208 (6.62823486328125MB)
   55.811767578125% used
To Space:
   capacity = 14680064 (14.0MB)
   used     = 0 (0.0MB)
   free     = 14680064 (14.0MB)
   0.0% used
PS Old Generation
   capacity = 130023424 (124.0MB)
   used     = 47620208 (45.41416931152344MB)
   free     = 82403216 (78.58583068847656MB)
   36.624330089938255% used

30756 interned Strings occupying 3701648 bytes.

jmap -histo:live <pid> 输出堆中对象的统计信息

  • 指定 live可选项, 则只输出活动的对象
  • 统计信息 编号num, 对象数量#instances, 内存大小#bytes, 类class name

C:\Program Files\Java\jdk1.8.0_121\bin>jmap -histo:live 20300

 num     #instances         #bytes  class name
----------------------------------------------
   1:         99666       13990288  [C
   2:         37191        3272808  java.lang.reflect.Method
   3:         97717        2345208  java.lang.String
   4:         50241        1607712  java.util.concurrent.ConcurrentHashMap$Node
   5:         11519        1290712  java.lang.Class
   6:         28143        1125720  java.util.LinkedHashMap$Entry
   7:         20851        1063288  [Ljava.lang.Object;
   8:         13723         934840  [Ljava.util.HashMap$Node;
   9:         29112         931584  java.lang.ref.WeakReference
  10:         15737         881272  java.util.LinkedHashMap
  11:         25661         821152  java.util.HashMap$Node
  12:          5303         754808  [B
  13:          5312         618064  [I
  14:         21366         472712  [Ljava.lang.Class;
  15:           341         465776  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  16:         11521         460840  java.lang.ref.SoftReference
  17:         17591         422184  java.util.ArrayList
  18:         22564         361024  java.lang.Object
  19:         13440         322560  java.beans.MethodRef
...
...
Total        791101       41319560
...
...
class name类型
Bbyte
Cchar
Ddouble
Ffloat
Iint
Jlong
Zboolean
[数组, 如 [I是 int[]
[L+package and class name表示对象

jmap -clstats <pid> 输出类加载器信息

  • 参数 -clstats-permstat的替代方案, 在 JDK8之前, 通过 -permstat打印类加载器的数据

C:\Program Files\Java\jdk1.8.0_121\bin>jmap -clstats 20300
Attaching to process ID 20300, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness..............................................................liveness analysis may be inaccurate ...
class_loader    classes bytes   parent_loader   alive?  type

<bootstrap>     2948    5125781   null          live    <internal>
0x0000000703933390      1       880     0x0000000701814b00      dead    sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x0000000701ed4ee8      1       880     0x0000000701814b00      dead    sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x0000000701b44ab8      1       1473    0x0000000701814b00      dead    sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x0000000701ed47e0      1       880     0x0000000701814b00      dead    sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x0000000701861f88      0       0       0x0000000701814b00      live    java/util/ResourceBundle$RBClassLoader@0x00000007c00f5470
0x0000000701b44ea0      1       1473    0x0000000701814b00      dead    sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x0000000701ed43f8      1       880     0x0000000701814b00      dead    sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x0000000702bb43a0      1       1471      null          dead    sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x0000000703932c88      1       880     0x0000000701814b00      dead    sun/reflect/DelegatingClassLoader@0x00000007c0009df8
...
...
total = 111     11286   19084340            N/A         alive=8, dead=103           N/A
...
...

jmap -finalizerinfo <pid> 输出等待终结的对象信息


C:\Program Files\Java\jdk1.8.0_121\bin>jmap -finalizerinfo 20300
Attaching to process ID 20300, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13
Number of objects pending for finalization: 0 

  • 0 当前没有等待完成的对象的信息

jmap -dump:format=b,file=heapdump.hprof <pid> 生成堆转储快照 dump文件

  • 参数 live可选项, 则堆中只有活动的对象会被转储
  • 指定 hprof二进制文件格式转储 Java堆信息 dump到指定文件中
jhat <heap dump file> 分析通过 jmap生成的文件
  • 当堆文件比较大, 可能会报堆空间不足错误, 可以加参数 jhat -J-Xmx512m <heap dump file>, 内存大小可根据自己电脑进行设置
  • 分析内容, 可以 Web形式显示(http://localhost:7000/), 并且在 Web页面中执行 OQL(对象查询语言)

jstat

  • 通过 jps工具查看需要监控的 pid, 然后使用 jstat -<option> <pid>命令查看指定运行的程序, JVM统计信息

jstat -class <pid> 监视类装载卸载等信息, 如 加载的类数量, 所占空间 等


C:\Program Files\Java\jdk1.8.0_121\bin>jstat -class 1272
Loaded  Bytes  Unloaded  Bytes     Time
 10909 20257.2        0     0.0      12.98

jstat -compiler <pid> 统计编译行为信息


C:\Program Files\Java\jdk1.8.0_121\bin>jstat -compiler 1272
Compiled Failed Invalid   Time   FailedType FailedMethod
    7058      0       0     2.57          0

jstat -gc <pid> 监视 GC堆状况信息


C:\Program Files\Java\jdk1.8.0_121\bin>jstat -gc 1272
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
12288.0 13312.0 9248.1  0.0   531456.0 320790.7  123904.0   45498.0   53720.0 52313.2 6872.0 6541.4     16    0.211   2      0.183    0.394

字段说明
S0C第一个幸存区的大小
S1C第二个幸存区的大小
S0U第一个幸存区的使用大小
S1U第二个幸存区的使用大小
EC伊甸园区的大小
EU伊甸园区的使用大小
OC老年代大小
OU老年代使用大小
MC方法区大小
MU方法区使用大小
CCSC压缩类空间大小
CCSU压缩类空间使用大小
YGC年轻代垃圾回收次数
YGCT年轻代垃圾回收消耗时间
FGC老年代垃圾回收次数
FGCT老年代垃圾回收消耗时间
GCT垃圾回收消耗总时间

jstat -gccapacity <pid> 监视各区大小


C:\Program Files\Java\jdk1.8.0_121\bin>jstat -gccapacity 1272
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
 65536.0 1040384.0 558080.0 12288.0 13312.0 531456.0   131072.0  2080768.0   123904.0   123904.0      0.0 1095680.0  53720.0      0.0 1048576.0   6872.0     16     2

字段说明
NGCMN新生代最小容量
NGCMX新生代最大容量
NGC当前新生代容量
S0C第一个幸存区的大小
S1C第二个幸存区的大小
EC伊甸园区的大小
OGCMN老年代最小容量
OGCMX老年代最大容量
OGC当前老年代大小
OC老年代大小
MCMN最小元数据容量
MCMX最大元数据容量
MC当前元数据空间大小
CCSMN最小压缩类空间大小
CCSMX最大压缩类空间大小
CCSC压缩类空间大小
YGC年轻代垃圾回收次数
FGC老年代垃圾回收次数

jstat -gcutil <pid> 监视垃圾收集信息


C:\Program Files\Java\jdk1.8.0_121\bin>jstat -gcutil 1272
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
 75.26   0.00  59.62  36.72  97.38  95.19     16    0.211     2    0.183    0.394

字段说明
S0第一个幸存区使用的空间百分比
S1第二个幸存区使用的空间百分比
E伊甸园区使用的空间百分比
O老年代区使用的空间百分比
M元数据区使用的空间百分比
CCS压缩使用的空间百分比
YGC年轻代垃圾回收次数
YGCT年轻代垃圾回收消耗时间(单位秒)
FGC老年代垃圾回收次数
FGCT老年代垃圾回收消耗时间(单位秒)
GCT垃圾回收消耗总时间(单位秒)

jstat -gccause <pid> 监视垃圾收集信息, 与 -gcutil一样, 只是多了 GC产生的原因


C:\Program Files\Java\jdk1.8.0_121\bin>jstat -gccause 1272
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC              
 75.26   0.00  59.46  36.72  97.38  95.19     16    0.211     2    0.183    0.394 Allocation Failure   No GC 

字段说明
LGCC最后一次 GC原因
GCC当前 GC原因(No GC为当前没有执行 GC)

jstat -gcnew <pid> 监视新生代统计


C:\Program Files\Java\jdk1.8.0_121\bin>jstat -gcnew 1272
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
12288.0 13312.0 9248.1    0.0  1  15 13312.0 531456.0 318598.4     16    0.211

字段说明
S0C第一个幸存区大小
S1C第二个幸存区的大小
S0U第一个幸存区的使用大小
S1U第二个幸存区的使用大小
TT对象在新生代存活的次数
MTT对象在新生代存活的最大次数
DSS期望的幸存区大小
EC伊甸园区的大小
EU伊甸园区的使用大小
YGC年轻代垃圾回收次数
YGCT年轻代垃圾回收消耗时间

jstat -gcnewcapacity <pid> 监视新生代各区大小


C:\Program Files\Java\jdk1.8.0_121\bin>jstat -gcnewcapacity 1272
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC
   65536.0  1040384.0   558080.0 346624.0  12288.0 346624.0  13312.0  1039360.0   531456.0    16     2

字段说明
NGCMN新生代最小容量
NGCMX新生代最大容量
NGC当前新生代容量
S0CMX最大第一个幸存区大小
S0C当前第一个幸存区大小
S1CMX最大第二个幸存区大小
S1C当前第二个幸存区大小
ECMX最大伊甸园区大小
EC当前伊甸园区大小
YGC年轻代垃圾回收次数
FGC老年代回收次数

jstat -gcold <pid> 监视老年代统计


C:\Program Files\Java\jdk1.8.0_121\bin>jstat -gcold 1272
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT
 53720.0  52313.2   6872.0   6541.4    123904.0     45498.0     16     2    0.183    0.394

字段说明
MC方法区大小
MU方法区使用大小
CCSC压缩类空间大小
CCSU压缩类空间使用大小
OC老年代大小
OU老年代使用大小
YGC年轻代垃圾回收次数
FGC老年代垃圾回收次数
FGCT老年代垃圾回收消耗时间
GCT垃圾回收消耗总时间

jstat -gcoldcapacity <pid> 监视老年代各区大小


C:\Program Files\Java\jdk1.8.0_121\bin>jstat -gcoldcapacity 1272
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT
   131072.0   2080768.0    123904.0    123904.0    16     2    0.183    0.394

字段说明
OGCMN老年代最小容量
OGCMX老年代最大容量
OGC当前老年代大小
OC老年代大小
YGC年轻代垃圾回收次数
FGC老年代垃圾回收次数
FGCT老年代垃圾回收消耗时间
GCT垃圾回收消耗总时间

如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值