JVMクエスト:メモリ・オーバーフローのMAT分析

ノートのこのシリーズは、主に基づいており、「Java仮想マシンの深い理解:JVMは、第2版を高度な機能を、ベストプラクティス」を読んノートの本です。

MATは、Javaヒープメモリを分析するためのツールである、完全な名前は、ヘルプにメモリリークを分析し、メモリ消費量を削減、Eclipseのメモリアナライザツールです。Javaのヒープのスナップショットを使用してMAT分析は、迅速回収されたオブジェクトを防ぐための理由を見つけ、予約サイズ(保持サイズ)のオブジェクトを計算することができ、MATは自動的に疑わしいメモリリークを含むレポートを生成します。

MATは、EclipseのWebサイトからダウンロードできます。http://www.eclipse.org/mat/

ダンプを生成します

ヒープメモリのスナップショットであるヒープ・ダンプ、以下の方法のスナップショットを使用してMAT分析:

  • 仮想マシンのパラメータに-XXを使用してください:+ HeapDumpOnOutOfMemoryErrorは、自動的にスナップショットのオーバーフローを発生させます。
  • jmapの-dump使用jmapのコマンド形式:= B、ファイル= $ {DIR} /jmap.hprof PID
  • 使用MATは、ローカルのJavaプロセスメモリのスナップショットをエクスポートし、[ファイル] - > [獲得ヒープDump->選択すると、Javaプロセス、それをダンプします。

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、メモリオーバーフローの最終用語の過程にあった回復の欠如、その結果、存在があることを示しているためA。

結果により、容易に特定のコードに配置し、次に理由はシングルモードの実施形態を使用してのようなキャッシュされていなかったような、オブジェクトを解放することができないか、何であるかを分析することができます。

たとえば、これは実行の結果であるとします。

画像

上図は、コードを見て、新しいオブジェクト起因VelocitySqlBulderクラスをインスタンス各コールの元の時間が非常に単一の方法として、修正、ステートレスなツールでは解決することができ、外部参照のVelocitySqlBulderの多数を保持しますこの問題。

フォローアップ観測

問題を説明していないならば、上記の分析の結果に応じて問題に対処して、前の動作を制御し、オブジェクトが成長し続けているかどうかを確認した後、この場所は解決されました。

メモリオールド・ペルミ地方と最終的な範囲内に安定化かどうかを確認するために、時間を追跡し、その後最後にJSTATと、長い時間で安定した範囲の説明オーバーフローの問題が解決された、または分析され、処理が継続されます場合は、されています安定します。

おすすめ

転載: www.cnblogs.com/cellei/p/12240241.html