1、粗略查看内存情况
分析具体的对象数目和占用内存大小
jmap -histo:live 1 |
2、导出、分析dump文件
jmap -dump:live,format=b,file=dump.dat 1 |
- 用 jhat分析(不推荐)
简介:jhat 是Java堆分析工具(Java heap Analyzes Tool)。JDK自带工具。 命令与jmap搭配使用, 来分析jmap生成的堆转储快照。jhat内置了一个微型的HTTP/Web服务器, 生成堆转储快照的分析结果后, 可以在浏览器中查看
使用方式:jhat -J-Xmx512M dump.dat,浏览器localhost:7000
总结:由于一般无法在服务器直接分析,需要复制到本地处理。分析工作是一个耗时而且极为耗费硬件资源的过程, 既然都要在其他机器上进行, 就没有必要再受命令行工具的限制了。功能太过于简陋,可以使用更强大的性能分析工具。
ps:若dump出来的堆较大,需加参数:jhat -J-Xmx512m <heap dump file>;
- 用 MAT(http://www.eclipse.org/mat/downloads.php) 分析(推荐)
- Histogram:可以列出内存中每个对象的名字、数量以及大小。
下图会把所有的对象的名字、数量和大小全部都列出来。其中对象大小为Shallow Heap(当前对象自己所占内存的大小,不包含引用关系);
在第一行可以搜索具体某个类型。找到怀疑的类型后,执行下图操作,查出是谁在用这些对象
右键 -> List objects -> with incoming references
右键 -> Path to GC Roots -> exclude weak references
- Dominator Tree:会将所有内存中的对象按大小进行排序,并且我们可以分析对象之间的引用结构。
图标的左下角有个红点,说明在这里可以被GC Roots访问到,不是System Class(是由我们自己创建的Thread)。能被GC Roots访问到导致不能被回收,导致它所持有的其它引用也无法被回收。
ps:若dump出来的堆较大,需把Xmx调大,若不是由于内存泄露造成不可回收,需要打开mat的Keep unreachable objects去分析不可触达的对象。
jvm工具简介:
1、查看进程1的线程
ps p 1 -L -o pcpu,pmem,pid,tid,time,tname,cmd |
2、转换16进制
printf "%x\n" 9731 |
3、打印堆栈信息
jstack -l 1 |
可用jca分析:https://www.ibm.com/support/pages/ibm-thread-and-monitor-dump-analyzer-java-tmda
- Download jca*.jar: https://public.dhe.ibm.com/software/websphere/appserv/support/tools/jca/jca469.jar
- Open a terminal or command prompt and change directory to where you downloaded the JAR file.
- Ensure that Java is on your PATH to run the tool.
- Launch the tool: java -jar jca*.jar
4、内存基本情况
jmap -heap 1 |
5、查看进程1的内存使用情况
ps -p 1 -o vsz,rss |
VSZ是指已分配的线性空间大小,这个大小通常并不等于程序实际用到的内存大小,产生这个的可能性很多,比如内存映射,共享的动态库,或者向系统申请了更多的堆,都会扩展线性空间大小,要查看一个进程有哪些内存映射,可以使用 pmap 命令来查看:
6、查看进程内存情况:
pmap -x 1 |
7、GC情况监控
参数:进程号 刷新时间(毫秒) 次数
jstat -gcutil 1 1000 20 |