jmap命令

jmap导出实例信息

该命令可以用来查看内存信息,实例个数以及占用内存大小。例如:

  1. 首先启动一个demo项目
  2. 通过jps查看进程(我们启动的项目叫FirstSpringBootApplication):

image.png

  1. 得到进程号为65000,通过jmap -histo 65000 > ./log.txt将内存信息导出。
  2. 因为是在D盘下导出的,所以能在D盘下找到该文件。打开如下:

image.png

  • num:序号
  • instances:实例数量
  • bytes: 占用空间大小
  • class name: 类名称

jmap查看堆信息

命令: jmap -heap 进程号
例如:jmap -heap 5256
image.png

jmap导出堆信息

可以通过jmap -dump:format=b,file=eureka.hprof 5256导出堆信息到一个文件。

也可以设置JVM参数,当内存溢出时自动导出dump文件:

  • -XX:+HeapDumpOnOutOfMemoryError
  • -XX:HeapDumpPath=./ (路径)

然后通过jvisualvm工具导入该dump文件并分析:
image.png
例如如上图所示,看到User对象占用非常多,所以是由于该对象导致的OOM。
此外,有很多String对象,是因为User对象中有String对象;
很多char[]对象,因为String的底层是char。

Jstack命令

堆栈追踪工具,

Jstack查看死锁。

jstack 进程号
例如:
jstack 4556:
image.png

Jstack分析CPU占用过高

  1. 先用top命令查看是哪个进程导致了CPU占用过高;
  2. 然后使用top -p 来显示Java进程的内存情况,pid是java进程号;

image.png

  1. 按大写的H,获取每个线程的运行情况:

image.png

  1. 找到占用最高的线程ID,比如19664;
  2. 转化为十六进制得到0x4cd0
  3. 执行jstack 19663 | grep -A 10 4cd0得到线程堆栈信息中4cd0这个线程所在行的后面10行,从堆栈中可以发现导致CPU飙高的调用方法。

Jstat(调优最重要命令)

jstat -gc pid最常用,用来评估程序内存使用及GC压力整体情况。

image.png

  • S0C: 第一个survivor区的