JVM 퀘스트 : 메모리 오버 플로우의 MAT 분석

노트의이 시리즈는 주로 기반으로 "자바 가상 머신에 대한 심층적 인 이해 : JVM은 고급 기능과 모범 사례 2 판은"독서 노트의 책이다.

MAT는 자바 힙 메모리를 분석하는 도구이며, 전체 이름은 이클립스 메모리 분석기 도구 도움말을 메모리 누수를 분석하고, 메모리 소비를 줄일 수있다. 자바 힙 스냅 샷을 사용하여 MAT 분석, 신속, 예비 크기 (잉여금 크기) 객체를 계산 객체가 복구되는 것을 방지하기 이유를 찾을 수 MAT는 자동으로 메모리가 의심 누수가 포함 된 보고서를 생성합니다.

MAT는 이클립스 웹 사이트에서 다운로드 할 수 있습니다 http://www.eclipse.org/mat/

덤프 생성

힙 메모리, 다음과 같은 방법의 스냅 샷의 스냅 샷입니다 힙 덤프를 사용하여 MAT 분석 :

  • 매개 변수 -XX 가상 머신 사용 : + HeapDumpOnOutOfMemoryError를 자동으로 스냅 샷 오버 플로우를 생성합니다.
  • 사용 jmap는 명령, jmap의 -dump : 형식 = B, 파일 = $ {DIR} /jmap.hprof PID
  • 사용 MAT 로컬 자바 프로세스 메모리의 스냅 샷을 내보낼 파일 -> 획득 힙 Dump-> 선택은 자바 프로세스를 덤프.

MAT 사용

덤프를 구축 완료 후 MAT 파일과 스냅 샷 파일의 덤프 열 수 있습니다 -> 열기 힙 덤프가 분석을 위해 덤프 파일, 개요보기를 생성합니다 :

영상

첫째는 힙 메모리 크기, 클래스의 수, 개체의 수, 얼마나 많은 클래스 로더를 나열.

그런 다음 개체의 크기가 형성되는 원형 차트 잉여금 크기, 마우스를 올려,이 오브젝트는 관리자 측면보기 표시를 왼쪽에 대해 자세히 설명합니다.

다음과 같은 일반적으로 사용되는 차트와 같은 다른 기능은, 히스토그램 히스토그램은, 도미네이터 트리 지배자 나무도 누출 보고서를 용의자 분석 보고서를 생성합니다.

기본 개념

분석을 계속하기 전에 몇 가지 기본 개념을 이해합니다.

얕은 힙 和 힙 잉여금

Shallow Heap表示对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。

Retained Heap是该对象自己的Shallow Heap,并加上从该对象能直接或间接访问到对象的Shallow Heap之和。换句话说,Retained Heap是该对象GC之后所能回收到内存的总和。

把内存中的对象看成下图中的节点,并且对象和对象之间互相引用。这里有一个特殊的节点GC Roots,这就是reference chain的起点。

영상

从obj1入手,上图中蓝色节点代表仅仅只有通过obj1才能直接或间接访问的对象。因为可以通过GC Roots访问,所以左图的obj3不是蓝色节点;而在右图却是蓝色,因为它已经被包含在retained集合内。所以对于左图,obj1的retained size是obj1、obj2、obj4的shallow size总和;右图的retained size是obj1、obj2、obj3、obj4的shallow size总和。obj2的retained size可以通过相同的方式计算。

对象引用 Reference

关于对象的引用,前面的文章讲到过,划分如下:

  • 强引用(Strong Reference)就是在代码中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收被引用的对象。

  • 软引用(Soft Reference)是用来描述有用非必需的对象。软引用关联的对象,在系统将要发生内存溢出之前,将会对这些对象进行二次回收。如果这次回收后还没有足够的内存,才会抛出内存溢出异常。上面所说的“食之无味,弃之可惜”的对象就是属于软引用。

  • 弱引用(Weak Reference)是用来描述非必需的对象,但是比软引用更弱一些,弱引用关联的对象只能生存到下一次垃圾收集发生之前。当下一次垃圾收集时,无论内存是否足够,都会回收掉被弱引用关联的对象。

  • 虚引用(Phantom Reference)也称为幽灵引用或者幻影引用,它是最弱的一种引用。一个对象是否有虚引用存在,完全不会对其生存时间造成任何影响,也无法通过虚引用获得一个对象实例。为对象设置虚引用的目的,就是能在这个对象被收集器回收时收到一个系统通知。

四种引用中,只有强引用是强可达性,根据可达性分析回收内存时,永远不会被回收。

GC Roots 和 引用链

JVM在进行GC的时候是通过使用可达性来判断对象是否存活,通过GC Roots(GC根节点)的对象作为起始点,从这些节点开始进行向下搜索,搜索所走过的路径成为Reference Chain(引用链),当一个对象到GC Roots没有任何引用链相连(用图论的话来说就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。

如下图所示,对象Object 5、Object 6、Object 7虽然互相关联,但是它们到GC Roots是不可达的,所以它们将被判定为可回收的对象:

영상

在 Java 中,可作为 GC Roots 的对象有以下几种:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象。
  • 方法区中类静态属性引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象。

四种引用,GC Roots以及引用链,可以参考之前的博客文章:《JVM探秘:四种引用、对象的生存与死亡》

Histogram 直方图

点击工具栏上的영상图标,打开 Histogram 直方图视图,可以列出每个类产生的实例数量,以及所占用的内存大小和百分比。主界面如下图所示:

영상

图中Shallow Heap 和 Retained Heap分别表示对象自身不包含引用的大小和对象自身并包含引用的大小,具体请参考下面 Shallow Heap 和 Retained Heap 部分的内容。默认的大小单位是 Bytes,可以在 Window - Preferences 菜单中设置单位,图中设置的是KB。

通过直方图视图可以很容易找到占用内存最多的几个类(通过Retained Heap排序),还可以通过其他方式进行分组(见下图):

영상

如果存在内存溢出,时间久了溢出类的实例数量或者内存占比会越来越多,排名也越来越靠前。可以点击工具类上的영상图标进行对比,通过多次对比不同时间点下的直方图对比就很容易把溢出的类找出来。

Dominator Tree 支配树

点击工具栏上的영상图标可以打开Dominator Tree(支配树)视图,在此视图中列出了每个对象(Object Instance)与其引用关系的树状结构,同时包含了占用内存的大小和百分比。

영상

通过Dominator Tree视图可以很容易的找出占用内存最多的几个对象(根据Retained Heap或Percentage排序),和Histogram类似,也可以通过不同的方式进行分组显示。

定位溢出源

Histogram视图和Dominator Tree视图的角度不同,前者是基于类的角度,后者是基于对象实例的角度,并且可以更方便的看出其引用关系。

첫째, 두 개의 뷰 객체 또는 클래스 의심 오버플로 발견 (정렬하여 힙을 보존하고, 입력 한 이름 클래스 만 지정된 클래스 이름 정규 표현식 키워드 표시 될 수있다), GC 뿌리 후 마우스 오른쪽 버튼으로 클릭 경로 (히스토그램이 아님) 또는 모든 팬텀 / 약한 / 소프트 등 참조 제외 GC 뿌리 짧은 경로를 병합하고, 선택

영상

즉 만 강한 참조를 의미는 상기와 GC 뿌리 체인 부분을 인용 한 GC GC 루트 뿌리 수단은, 후자는 부드러운 거짓 약한 제외하는 것을 의미하는 모든 가상 / 약한 / 소프트 등 참조를 제외하고 참조 인용 객체는 항상 GC가 아닌 경우, 다른 참조가, JVM GC 손실 될 수 있습니다 강한 참조뿐만 아니라, 그것은 강한 참조가 GC, 메모리 오버 플로우의 최종 기간의 과정에있다 회복의 부족의 결과로, 존재가 보여주기 때문에 가.

결과를 쉽게 특정 코드를 배치 한 다음 그 이유는 단일 - 모드 실시 예를 이용하여 같은 캐시되지 같은 객체를 방출 할 수없는 또는 어떤 분석 될 수있다.

예를 들어,이 실행 결과 인 경우 :

영상

위의 그림은 다음 코드를 보았다 외부 참조의 VelocitySqlBulder, 많은 수의 유지, 각 호출 인스턴스 새 개체로 인해 VelocitySqlBulder 클래스의 원래 시간은 그래서 하나의 방식과 같이 개정 무 도구, 해결 될 수있다 이 문제를 해결합니다.

후속 관찰

다음 위의 분석 결과에 따라 문제를 해결하고, 후 전에 작동을 제어하고, 오브젝트가 성장을 계속 한 경우이 장소가 해결 된 문제를 설명하지 않을 경우 다음을 참조하십시오.

마지막 그러면 jstat하고 메모리 오래 파마 영역과 안정한 범위 설명 플로우 문제를 오랫동안 해결 된 경우, 범위 내에서 안정화 된, 혹은 계속해서 최종 분석 및 처리 될 경우,왔다보고, 시간 추적 안정적인합니다.

추천

출처www.cnblogs.com/cellei/p/12240241.html