实战JAVA虚拟机 JVM故障诊断与性能优化(七)

分析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,找到当前对象引用的对象,即出引用with outgoing references。

 

浅堆和深堆 

  浅堆(Shallow Heap)和深堆(Retained Heap)是两个非常重要的概念,分别表示一个对象结构占内存的大小和一个对象被GC回收后,可以真实释放的内存大小。

Tomcat堆溢出分析

  思想:分析Dump文件,选择占堆内存较大的区块,进行引用跟踪,找到频繁出现的堆内存中的对象

  

原文地址:https://www.cnblogs.com/kaishi/p/7517349.html