jmap命令
jmap导出实例信息
该命令可以用来查看内存信息,实例个数以及占用内存大小。例如:
- 首先启动一个demo项目
- 通过jps查看进程(我们启动的项目叫FirstSpringBootApplication):
- 得到进程号为65000,通过
jmap -histo 65000 > ./log.txt
将内存信息导出。 - 因为是在D盘下导出的,所以能在D盘下找到该文件。打开如下:
- num:序号
- instances:实例数量
- bytes: 占用空间大小
- class name: 类名称
jmap查看堆信息
命令: jmap -heap 进程号
例如:jmap -heap 5256
jmap导出堆信息
可以通过jmap -dump:format=b,file=eureka.hprof 5256
导出堆信息到一个文件。
也可以设置JVM参数,当内存溢出时自动导出dump文件:
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=./ (路径)
然后通过jvisualvm工具导入该dump文件并分析:
例如如上图所示,看到User对象占用非常多,所以是由于该对象导致的OOM。
此外,有很多String对象,是因为User对象中有String对象;
很多char[]对象,因为String的底层是char。
Jstack命令
堆栈追踪工具,
Jstack查看死锁。
jstack 进程号
例如:jstack 4556
:
Jstack分析CPU占用过高
- 先用top命令查看是哪个进程导致了CPU占用过高;
- 然后使用top -p
来显示Java进程的内存情况,pid是java进程号;
- 按大写的H,获取每个线程的运行情况:
- 找到占用最高的线程ID,比如19664;
- 转化为十六进制得到0x4cd0
- 执行
jstack 19663 | grep -A 10 4cd0
得到线程堆栈信息中4cd0这个线程所在行的后面10行,从堆栈中可以发现导致CPU飙高的调用方法。
Jstat(调优最重要命令)
jstat -gc pid
最常用,用来评估程序内存使用及GC压力整体情况。
- S0C: 第一个survivor区的