值得阅读的内存泄露分析总结和Tomcat调优
MAT是专门用来说明内存dump文件的器材,必要有Eclipse才气跑。先用jmap指令可以抓到dump文件,详细指令名目如下:
pid就是你的java历程id,必要留意的是行使这个要领抓dump时,tomcat要用startup.bat去启动,假如以处事的方法启动,这个指令会报错,也许是权限题目。这里有个要留意的,抓Heap dump时会先举办垃圾接纳,再天生dump文件。 直接用MAT打开Dump文件,然后器材还会帮你天生一份说明陈诉,汇报你也许存在内存泄漏的处所。空话不多说,上图,下图是对内存泄漏的说明陈诉,点进去可以看到详情信息 MAT最重要的成果就是可以说明Heap里的Object、类和引用相关。 下图列出了Heap中全部的工具,这里是以Class的方法展示的,然后这里末端两列必要存眷一下,Shallow Heap是自身在Heap内里占用的巨细,Retained Heap是引用的工具总工占用的巨细,单元都是字节。由于一开始就是猜疑代码存在内存泄漏,担忧代码内里界说的静态变量占用内存太多。刚开始看到String范例占用了大部门堆内存,然后进去可以看到String类内里由哪些工具引用占用了。 下图是查察String类的全部引用工具,然后点最后一个Retained Heap可以按从大到小分列,可以看到,最大的那几个公然是我本身代码内里界说的静态变量,图中圈红的处所就是类的仓库地点,由于这个静态缓存的类是单例实现的,以是在这里呈现这个类名的处所后头跟的仓库地点都是一样的。 MAT还支持查询,按照类名,查询某个地点上的工具,下图就是通过地点查找某个工具。 通过一些说明我发明之前担忧静态变量太多导致内存占用太多着实是多虑了,由于缓存的那几个静态变量都只存了一份,而且他们的Retained Heap也不大,对整个内存没多大影响。固然对内存泄漏说明没什么盼望可是照旧有一些发明,我看到了许多在代码中手动挪用logger.info()打印的日记信息都存在堆中。这些logger.info当初都是为了调试可能说明题目时添加的,后头也就放着没删,有一些打印输出的内容还挺大,这些后头城市占用Heap。 MAT尚有个很重要的骚操纵就是可以添加两个Dump来比拟,此刻追念我认为这个着实就可以确定是否存在内存泄漏。抓Dump时要留意的是抓两个Dump中间最好要有必然的时距离断,这个时距离断中最好应用要颠末必然的压力测试。下图就是两个Dump的比拟图,第二个Dump就是我用LoadRunner压了一晚上之后再抓的。这里#0就是第二个Dump,#1就是第一个Dump。可以发明,一个晚上的压力测试之后,在GC之后天生的Heap Dump文件内里Shallow Heap的巨细变革不是很大,Object的数目变革也不是很大,声名白GC对Heap内里工具接纳状况差不多,假如存在内存泄漏,存在不能被接纳的工具,那第二个Dump文件内里应该会呈现比第一个Dump文件大许多的类和Object,然则颠末这么长时刻的压力测试,并没有呈现这种扎眼球的工具和类,以是根基可以断定应用不存在内存泄漏的状况。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |