1. 使用 jmap 命令生成 dump 文件
jmap -dump:live,format=b,file=d:\dump\heap.hprof
2. 使用 jcmd 命令生成 dump 文件
jcmd
GC.heap_dump d:\dump\heap.hprof
3. 使用 JVM 参数获取 dump 文件
这可是一个非常有用的参数,因为当你需要分析Java内存使用情况时,往往是在OOM(OutOfMemoryError)发生时。
注意:JVM 生成 Heap Dump 的时候,虚拟机是暂停一切服务的。如果是线上系统执行 Heap Dump 时需要注意。
4. 使用其它工具获取dump文件
分析 Heap Dump 的工具都可以获取 Heap Dump 文件。
比如:jdk 自带的工具 jvisualvm。
其它工具:Eclipse memory analyzer(jmat)、JProfiler 等。
1.设置栈大小 2-3.设置堆大小 4.当OutOfMemoryError发生时自动生成 Heap Dump 文件 5.指定文件生成位置
1.效果
2.采用jdk VisualVM 自带工具 打开
jps:虚拟机的进程状况工具
功能:列出正在运行的虚拟机进程,并显示虚拟机执行的主类(Main Class所在的类),以及这些进程的LVMID,这些LVMID与操作系统的进程ID(PID)是一致的
-q:仅输LVMID,省略主类的名称
-m:输出虚拟机进程启动时传递给main()函数的参数
-l:输出主类的全名,如果执行的时jar包,输出jar包路劲
-v:输出jvm参数
jstat:虚拟机统计信息监视工具
功能:用于监视虚拟机各种运行状态信息的命令行工具。他可以显示本地多或远程虚拟机进程中类加载,内存,垃圾收集,即时编译等运行时数据。
1. jstat -gc pid
可以显示gc的信息,查看gc的次数,及时间。
其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
2.jstat -gccapacity pid
可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,
如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,
PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。
其他的可以根据这个类推, OC是old内纯的占用量。
3.jstat -gcutil pid
统计gc信息统计。
4.jstat -gcnew pid
年轻代对象的信息。
5.jstat -gcnewcapacity pid
年轻代对象的信息及其占用量。
6.jstat -gcold pid
old代对象的信息。
7.stat -gcoldcapacity pid
old代对象的信息及其占用量。
8.jstat -gcpermcapacity pid
perm对象的信息及其占用量。
9.jstat -class pid
显示加载class的数量,及所占空间等信息。
10.jstat -compiler pid
显示VM实时编译的数量等信息。
11.stat -printcompilation pid
当前VM执行的信息。
一些术语的中文解释:
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)
NGCMN:年轻代(young)中初始化(最小)的大小 (字节)
NGCMX:年轻代(young)的最大容量 (字节)
NGC:年轻代(young)中当前的容量 (字节)
OGCMN:old代中初始化(最小)的大小 (字节)
OGCMX:old代的最大容量 (字节)
OGC:old代当前新生成的容量 (字节)
PGCMN:perm代中初始化(最小)的大小 (字节)
PGCMX:perm代的最大容量 (字节)
PGC:perm代当前新生成的容量 (字节)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
TT: 持有次数限制
MTT : 最大持有次数限制
jinfo:java配置信息工具
功能:实时查看和调整虚拟机各项参数,只能调整在运行期间可写的虚拟机参数值
查看系统参数:
jinfo -sysflags 72956
虚拟机的参数可以通过这个命令查看:
java -XX:+PrintFlagsFinal -version | grep manageable
除了通过启动脚本可以设置参数,PrintGC 默认是打开的,因此我们只需要打开 PrintGCDetails 参数。
jinfo -flag +PrintGC 72956
jinfo -flag +PrintGCDetails 72956
关闭 GC 日志的话同理:
jinfo -flag -PrintGC 72956
jinfo -flag -PrintGCDetails 72956
查看是否开启 GC 日志的打印:
jinfo -flag PrintGC 72956
jinfo -flag PrintGCDetails 72956
jmap:java内存映像工具
功能:用于生成堆转储快照(heapdump),还可以查询finalize执行队列,java堆和方法区的详细信息,如空间使用率,当前使用那种收集器等。
如果使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。这与Solaris的pmap工具比较相似。
-dump:[live,]format=b,file= 使用hprof二进制形式,输出jvm的heap内容到文件, live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
-finalizerinfo 打印正等候回收的对象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的
Microsoft Windows [版本 10.0.17134.1726]
(c) 2018 Microsoft Corporation。保留所有权利。
C:\Users\Administrator>jps -l
42080
80448 sun.tools.jps.Jps
40412 org.jetbrains.jps.cmdline.Launcher
72956 com.well.studio.MainApplication
C:\Users\Administrator>jmap -heap 72956
Attaching to process ID 72956, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration: ##堆配置情况
MinHeapFreeRatio = 0 ##最小堆使用比例
MaxHeapFreeRatio = 100 ##最大堆可用比例
MaxHeapSize = 1816133632 (1732.0MB) ##最大堆空间大小
NewSize = 38273024 (36.5MB) ##新生代分配大小
MaxNewSize = 605028352 (577.0MB) ##最大可新生代分配大小
OldSize = 77070336 (73.5MB) ##老生代大小
NewRatio = 2 ##新生代比例
SurvivorRatio = 8 ##新生代与suvivor的比例
MetaspaceSize = 21807104 (20.796875MB) ##Metaspace扩容时触发FullGC的初始化阈值
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage: ##堆使用情况
PS Young Generation
Eden Space: ##新生代(伊甸区)
capacity = 144703488 (138.0MB)
used = 124553120 (118.78311157226562MB)
free = 20150368 (19.216888427734375MB)
86.07471853062727% used
From Space: ##survior1区
capacity = 14155776 (13.5MB)
used = 10404288 (9.92230224609375MB)
free = 3751488 (3.57769775390625MB)
73.49853515625% used
To Space: ##survior2 区
capacity = 14155776 (13.5MB)
used = 0 (0.0MB)
free = 14155776 (13.5MB)
0.0% used
PS Old Generation ##老生代使用情况
capacity = 83886080 (80.0MB)
used = 20003576 (19.07689666748047MB)
free = 63882504 (60.92310333251953MB)
23.846120834350586% used
21710 interned Strings occupying 2732136 bytes.
C:\Users\Administrator>
jhat:虚拟机堆转储快照分析工具
功能:搭配jmap时用,解析lmap生成的dump文件,其内置了http/web服务器,可在浏览器查看,但功能较为简单,而且一般也不会早期服务器去解析dump文件,所以用VVM等工具会好很多!
jstack:java堆栈跟踪工具
功能:用于生成虚拟机当前时刻的线程快照(threaddump/javacore),线程快照就是当前虚拟机每一条线程则正在执行的方法堆栈集合,生成目的为定位线程出现长时间卡顿的与原因,如线程间死锁,死循环,请求外部资源导致的长时间挂起等。
jdk 5 以后 ,java.lang.Thread类新增 getAllStackTraces()方法用于获取虚拟机种所有线程的StackTraceElement对象。使用这个方法通过一些代码封装就可以完成Jstack的大部分功能。
-F 当’jstack [-l] pid’没有相应的时候强制打印栈信息,如果直接jstack无响应时,用于强制jstack,一般情况不需要使用
-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多
(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。一般情况不需要使用
-m 打印java和native c/c++ 框架的所有栈信息.可以打印JVM的堆栈,显示上Native的栈帧,一般应用排查不需要使用
线程状态
想要通过jstack命令来分析线程的情况的话,首先要知道线程都有哪些状态,下面这些状态是我们使用jstack命令查看线程堆栈信息时可能会看到的线程的几种状态:
NEW,未启动的。不会出现在Dump中。
RUNNABLE,在虚拟机内执行的。
BLOCKED,受阻塞并等待监视器锁。
WATING,无限期等待另一个线程执行特定操作。
TIMED_WATING,有时限的等待另一个线程的特定操作。
TERMINATED,已退出的。
Jhsdb:基于服务性代理的调试工具
功能:相当于前几个汇总 , 但jdk9 才正式提供
后续再补
Jconsole:java监视与管理控制台
功能:Jconsole (Java Monitoring and Management Console),一种基于JMX的可视化监视、管理工具,可以跨服务管理,对远程虚拟机进行监控。
ManageBean