JVM内存分析操作
JPS
用来查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程,可以把jps理解为ps的一个子集。
查看当前运行的java项目的jvm配置
jps -v
常用参数说明
常用参数说明
-q 忽略输出的类名、Jar名以及传递给main方法的参数,只输出pid。
-m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null。
-l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。
-v 输出传给JVM的参数。
-V 输出通过标记的文件传递给JVM的参数(.hotspotrc文件,或者是通过参数-XX:Flags=< filename >指定的文件)。
-J 用于传递jvm选项到由javac调用的java加载器中,例如,“-J-Xms48m”将把启动内存设置为48M,使用-J选项可以非常方便的向基于Java的开发的底层虚拟机应用程序传递参数。
Jstack
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息
** 打印进程的线程堆栈信息 **
jstack pid
Jstat
Jstat用于监控基于HotSpot的JVM,对其堆的使用情况进行实时的命令行的统计,使用jstat我们可以对指定的JVM做如下监控:
- 类的加载及卸载情况
- 查看新生代、老生代及持久代的容量及使用情况
- 查看新生代、老生代及持久代的垃圾收集情况,包括垃圾回收的次数及垃圾回收所占用的时间
- 查看新生代中Eden区及Survior区中容量及分配情况等
打印执行过的GC
jstat -gc pid
jstat -gcutil pid
显示加载class的数量,及所占空间等信息
jstat -class pid
Jmap
打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。
基本参数:
-dump:[live,]format=b,file=< filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
-finalizerinfo 打印正等候回收的对象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
-J 传递参数给jmap启动的jvm.
pid 需要被打印配相信息的java进程id,可以用jps查问.
操作
内存占用情况
jmap -heap pid
Attaching to process ID 21232, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13
using thread-local object allocation.
Parallel GC with 2 thread(s)
Heap Configuration:
# 堆使用率小于 n 的情况下进行收缩
MinHeapFreeRatio = 0
# 堆使用率大于 n 的情况下进行收缩
MaxHeapFreeRatio = 100
# 堆的最大大小
MaxHeapSize = 2097152000 (2000.0MB)
# 新生代的初始大小
NewSize = 89128960 (85.0MB)
# 新生代的最大大小
MaxNewSize = 698875904 (666.5MB)
# 老年代大小
OldSize = 179306496 (171.0MB)
# 新生代与老年代空间占用比率
NewRatio = 2
# 设置为8,则两个Survivor区与一个Eden区的比值为2:8
SurvivorRatio = 8
# 分配给类元数据空间的初始大小
MetaspaceSize = 21807104 (20.796875MB)
# 类指针压缩空间大小, 默认为1G
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
# 新生代
Eden Space:
capacity = 508035072 (484.5MB)
used = 426823640 (407.05074310302734MB)
free = 81211432 (77.44925689697266MB)
84.01460125965477% used
# Survivor1
From Space:
capacity = 2621440 (2.5MB)
used = 1659920 (1.5830230712890625MB)
free = 961520 (0.9169769287109375MB)
63.3209228515625% used
# Survivor2
To Space:
capacity = 2621440 (2.5MB)
used = 0 (0.0MB)
free = 2621440 (2.5MB)
0.0% used
# 老年代
PS Old Generation
capacity = 380108800 (362.5MB)
used = 208175720 (198.5318374633789MB)
free = 171933080 (163.9681625366211MB)
54.76740343817349% used
38018 interned Strings occupying 4426664 bytes.
展示各类的内存占用情况,由大到小排列
jmap -histo pid
手动触发fullGC
jmap -histo:live pid
dump 将内存使用的详细情况输出到文件
jmap -dump:format=b,file=mem.dat pid
拓展:JVM在遇到OutOfMemoryError时自动生成Dump文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path
Jhat用于对JAVA heap进行离线分析的工具
参考文章:https://blog.csdn.net/fenglibing/article/details/6411999