jdk自带工具
在实际的项目开发当中,我们可以会碰到java程序占用内存过多,甚至导致进程被系统杀死的情况。那么我们可以使用什么工具来监控系统的内存使用情况呢,下面博主将简单的介绍一下jdk自带工具来监控系统的内存情况。
查找占用cpu或者内存过高的java进程
博主这里使用的springbootx项目,并且以jar包的方式运行。所以可以使用下面的命令来查看java进程。
top | grep java
jps命令
使用jps命令,可以查看jvm虚拟机中的进程,也就是说可以通过这个查看正在运行的java进程。
jps -l
命令执行结果:
jstat命令
使用jstat命令,可以查看jvm虚拟机中对应进程的统计信息,包括class文件的加载情况,gc垃圾回收,堆信息等。
#显示pid的类加载信息
jstat -class pid
#显示jit编译的相关信息
jstat -compiler pid
#显示和gc相关的堆信息
jstat -gc pid
#显示各个代的容量以及使用情况
jstat -gccapacity pid
jstack命令
使用jstack命令,可有查看当前线程的运行情况,包括方法栈和native栈,这里需要注意的是线程的状态。线程状态分为几种:
- Runnable,执行中。
- Blocked,线程阻塞。
- Waitting,线程等待。
- imeWaitting,有时间的等待。
#查看线程的方法栈和native栈的信息
jstack pid
由于长度限制,这里只截取了部分线程的栈信息。
jinfo命令
使用jinfo命令,可以查看某个进程的jvm参数和系统参数的配置信息。
jinfo pid
#查看某个配置的信息
jinfo -flag flagname pid
由于长度限制,这里只截取了部分jvm的配置信息。
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信息。
jhat命令
jat命令,可以用来分析jmap dump出来的文件信息,并且以html的方式展示
jhat 6084.dump
命令执行结果如下:
查看html页面:
可视化工具visualvm
博主这里使用的是windows系统下面的visualvm工具,visualvm可以进行统一查看java程序的jvm参数,线程情况,堆情况。