查看内存_利用jmap和MAT等工具查看JVM运行时堆内存

jmap

JDK自带了一些工具可以帮助我们查看JVM运行的堆内存情况,常用的是jmap命令

f941c2d896a3a6e3251a76262ae9e26c.png

jmap -heap 打印堆的使用情况

40145818b9375dee3e3bc249c062ce43.png

那么,从这个输出中我们也可以大致看出堆的结构,分为Young Generation (年轻代) 和 Old Generation (老年代)

Young Generation又被划分为:Eden Space , From Space 和 To Space

可以看到这里To区是干净的,还未被使用,From区已经使用了95%了

jmap -histo[:live] 打印类的实例数量、占用的内存、类的名称,通常我们并不需要看所有的,只需要看前几条即可

5e1b055bb7327fb0beb9b7a59c5e90f7.png

jmap -dump:live,format=b,file=heap.bin

以hprof二进制格式dump堆的使用情况(PS:相当于生成一个快照,后续我们可以对这个快照文件进行分析)

b282b40bc6388ab7f8d72204b405393b.png

Memory Analyzer (MAT)

文件dump下来以后,可以使用Eclipse的MAT插件进行查看

如果日常开发用的是eclipse的话,可以直接安装这个插件,如果不是的话,这个插件也可以独立运行

https://www.eclipse.org/mat/

https://www.eclipse.org/mat/downloads.php

解压之后双击MemoryAnalyzer.exe即可运行

1e5bf68c38740b8f4d50f915cda3f27f.png

打开刚才的heap.bin文件

5f20b23228ada4d828feb0733a1c6d47.png
2de1f034478a22d06daaa96cd4ccb9ec.png

可以看到下面有三个选项卡,包括可以执行的操作和报表

先看第一个Histogram

74469d8854126dc239b999b5d6a02f51.png

由于这里是随便运行的一个工程,并没有出现内存泄漏之类的问题,所以这里看到的都是一些基础的java类

查看引用

b215238579a2173539226ed9abf691fe.png

Dominator Tree 可以看到biggest object以及它们所占内存的比例

ab1528eca210f55a8fe2b3e2508da4be.png

我们一级一级的找,可以找到源文件,然后分析代码,最终定位到问题之根源

jconsole

可以查看本地的进程,也可以查看远程主机上的进程

4df3aac9c6251f6cea08c293c9d01ea5.png

例如:jconsole 192.168.102.16:9105

d50676669a907bdaccfebbe2871c92af.png
73b562fb4dabf5d61d66244cf78f59c5.png

或者本地

343290e39de5514efef108ab137baa2d.gif

其它

cf92aa81d77be310b8c0e39ee547b966.png
资源来源网络,侵删
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值