分析Java堆
1.对症下药:找到内存溢出的原因
内存溢出(OutofMemory,简称OOM),主要讨论最常见的集中内存溢出问题,包括堆溢出、直接内存溢出、永久区溢出等。
堆溢出
当对象大小之和大于由Xmx参数指定的堆空间大小时,会造成溢出。
直接内存溢出
在java的NIO(new IO)中,支持直接内存的使用,获取堆外的内存,这块内存是直接向操作系统申请的。
过多线程导致OOM
由于线程的栈空间也是堆外的分配的。
永久区溢出
存放类元数据的区域,如果一个系统定义太多的类,那么永久区会溢出。但在jdk1.8中,永久区被一块称为元数据区域取代,但是功能是类似的,都是为了保存类的元信息。
虚拟机内窥镜:使用MAT分析Java堆
1、MAT是什么?
MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。
2.为什么使用MAT?
当服务器应用占用了过多内存的时候,会遇到OutOfMemoryError。如何快速定位问题呢?Eclipse MAT的出现使这个问题变得非常简单。它能够离线分析dump的文件数据。
Eclipse MAT是SAP公司贡献的一个工具,可以在Eclipse网站下载到它,完全免费的。它可比Sun提供的内存镜像分析工具jhat要强太多了。
3.地址
首页:http://www.eclipse.org/mat/
插件更新地址:
http://download.eclipse.org/mat/1.0/update-site/
注意:可以使用jmap命令,生成堆的快照,使用发放:http://www.cnblogs.com/kaishi/p/7515216.html
File ---> acquire Heap Dump 打开正在运行的程序,或者打开dump文件
查看内存使用情况:
查看类柱状图
查看引用关系:
通过MAT可以找到引用当前对象的对象,即入引用 with incoming references,已经当前对象引用的对象,即出引用。
浅堆和深堆
浅堆(Shallow Heap)和深堆(Retained Heap)是两个非常重要的概念,分别表示一个对象结构占内存的大小和一个对象被GC回收后,可以真实释放的内存大小。
Tomcat堆溢出分析
思想:分析Dump文件,选择占堆内存较大的区块,进行引用跟踪,找到频繁出现的堆内存中的对象