前言
OOM的问题可能很多人都碰到过,今天要讲的就是因为容器的误用内存无法释放而导致内存溢出。最后排查出来是因为定义了一个实例变量的Map,而所有的线程都对这个Map进行add数据,而没有进行释放,最后直接OOM。这个问题如果只是简单的查看log日志会发现根本找不到问题,因为最后导火索可能是操作别的类引起的,而它可能是压垮骆驼的最后一根稻草。如果去排查代码,这个时候可能真的像大海捞针一样难,因为你不知道代码的哪个角落里有内存泄漏的代码。所以走查代码的办法对于代码量少的情况下是有效的。这个时候最想的就是要是有一种工具多好可以直接监听到那个巨大的内存块是谁分配的,这样就可以具体定位到那个类。所以这一次问题的排查也是依赖于这样一款工具的使用。
此文会分两部分来讲,第一部分会介绍这款工具的安装和破解;第二部分会讲我是如何利用这款工具来排查OOM问题的。
首先要介绍一下YourKit Java Profile,这款工具的功能非常强大,可以监控内存/CPU/GC/FGC等信息,另外就是一个具体的线程情况。
YourKit Java Profile的安装
这里用一个简单的篇幅来介绍一下这款工具的安装,因为很多人如果没有用过这款工具还是要废一番工夫来折腾的。好,废话不多说鸟。
下载
打开官网http://www.yourkit.com/java/profiler/ 然后点击需要下载的操作系统,点击下载,因为我的操作系统是windows的,所以对应下载的就是windows的版本。
安装
由于YourKit java profile 是一个付费的软件,所以只能试用几天,不过网上有破解的key生成器。
一、安装
具体的安装就不讲了,一般装过软件的都会安装,具体讲下面的如何破解
二、破解
1.先点开破解软件的生成器(假设你已经下载了)
2.点击"Patch",然后加载版本下的yjp.jar,一般在安装目录下的lib/下
3.生成Key,输入Name->点击Generate:
4.点开已经安装好的Yourkit java profile,这样会提示你输入注册码,这样就把上面生成的注册码给复制进去,然后点OK
5.点击OK后就到了主页,然后可以根据具体的PID进行分析
问题排查
上面用比较多的篇幅讲如何安装这款工具,接下来就要讲如何用这款工具进行排查问题。在这之前要讲讲如何远程监控服务器,网上有比较多的文章,有比较多的是讲如何在windows环境下监控Linux服务器。因为我的服务器也是windows的,所以和网上有些不一样,不过解决的办法其实很简单,只要在远程服务器再把这个软件装一遍(windows版本的),然后把工具启起来。在本机连接IP+端口号就OK了,下面附一张图。
连上后可以在主页看到几个标签,CPU/Threads/DeadLocks/Memory/GC等等,一般要用关注的也是这么几项。这一次我主要的要关心Memory也就是内存这一项。内存的区块也跟我们JVM中内存的分配一致,会统计新生代和老生代的一个内存情况,看下面一张图会比较有感性的认识:
接下来开始我的内存排查,回到问题本身,是因为内存溢出而直接JVM crash掉,而我并不知道是哪里的代码出了问题。而这一次我正是需要使用YourKit java profile中的内存分配链来查看哪里的代码出了问题。
这里第一步需要先开启记录内存分配的这样一个功能,如何开启如下图所示:
这个开启之后就可以看到整个对象的分配情况,哪些对象是特别耗内存可以看得清清楚楚,如下图所示:
看到了我上图的一个截图,这样就可以看到整个的内存分配情况,有点像异常链。通过这个我找到了一个类中定义了一个静态的HashMap,而在使用的过程中没有对它进行释放,直接导致内存溢出。如果通过传统看代码的情况去分析这个问题可能需要很长的时间才能找到问题。
性能优化-一次OOM的解决经验分享-谈动态扩容可能导致的内存隐患,布布扣,bubuko.com
性能优化-一次OOM的解决经验分享-谈动态扩容可能导致的内存隐患
原文:http://blog.csdn.net/luohuacanyue/article/details/17617645