内存排查(二)-使用jdk自带工具

jdk自带工具

在实际的项目开发当中,我们可以会碰到java程序占用内存过多,甚至导致进程被系统杀死的情况。那么我们可以使用什么工具来监控系统的内存使用情况呢,下面博主将简单的介绍一下jdk自带工具来监控系统的内存情况。

查找占用cpu或者内存过高的java进程

博主这里使用的springbootx项目,并且以jar包的方式运行。所以可以使用下面的命令来查看java进程。

top | grep java

查看java命令

jps命令

使用jps命令,可以查看jvm虚拟机中的进程,也就是说可以通过这个查看正在运行的java进程。

jps -l

命令执行结果:

jps命令

jstat命令

使用jstat命令,可以查看jvm虚拟机中对应进程的统计信息,包括class文件的加载情况,gc垃圾回收,堆信息等。

#显示pid的类加载信息
jstat -class pid

类加载情况

#显示jit编译的相关信息
jstat -compiler pid

jit编译情况

#显示和gc相关的堆信息
jstat -gc pid

显示gc堆的相关情况

#显示各个代的容量以及使用情况
jstat -gccapacity pid

命令执行结果

jstack命令

使用jstack命令,可有查看当前线程的运行情况,包括方法栈和native栈,这里需要注意的是线程的状态。线程状态分为几种:

  1. Runnable,执行中。
  2. Blocked,线程阻塞。
  3. Waitting,线程等待。
  4. imeWaitting,有时间的等待。
#查看线程的方法栈和native栈的信息
jstack pid

由于长度限制,这里只截取了部分线程的栈信息。

jstack命令

jinfo命令

使用jinfo命令,可以查看某个进程的jvm参数和系统参数的配置信息。

jinfo pid

#查看某个配置的信息
jinfo -flag flagname pid

由于长度限制,这里只截取了部分jvm的配置信息。

jinfo命令

jmap命令

使用jmap命令,可以查看jvm中对应进程的堆信息,比如说堆中各个对象的数量大小。

#打印当前堆中各个对象的数量、大小,如果添加了live属性,那么就说明只打印存活的对象
jmap -histo:live pid

#把内容转存到本地文件
jmap -dump:live,format=b,file=<filename> pid

#打印堆总结,包括堆的配置,GC。如堆最大值
jmap -heap pid

#打印等待回收对象的信息
jmap -finalizerinfo pid

#打印java堆perm区的classloader的信息
jmap -permstat pid

这里博主介绍一下如何使用jmap来导出堆的dump信息。

dump堆信息

jhat命令

jat命令,可以用来分析jmap dump出来的文件信息,并且以html的方式展示

jhat 6084.dump

命令执行结果如下:

命令执行结果

查看html页面:

查看html页面

可视化工具visualvm

博主这里使用的是windows系统下面的visualvm工具,visualvm可以进行统一查看java程序的jvm参数,线程情况,堆情况。

visualvm

博主微信公众号

原文地址:https://www.cnblogs.com/chenhaoblog/p/13575036.html