Matの使い方
4411 ワード
MAT
MATツールはすべてMemory Analyzer Toolと呼ばれ、Javaスタックのメモリを詳しく分析するツールで、このツールは非常に強く、このツールを使用するためにhprofファイルが必要です.
HPROFファイルには、特定の時点、javaプロセスのメモリスナップショットが格納されます.これらのデータを格納するフォーマットは異なり、スナップショットがトリガーされたときにjavaオブジェクトとクラスがheapにある場合が含まれます.スナップショットは一瞬のことなので、heap dumpには、オブジェクトがいつ、どこ(どのメソッドで)割り当てられるかという情報は含まれません.
いくつかの重要な概念: Histogram:メモリ内のオブジェクト、オブジェクトの数、およびサイズ がリストされます. Dominator Tree:最大のオブジェクトと、その生存に依存するObject(サイズはRetained Heapを基準として並べ替えられています) をリストします. Top Consumers:最大object をグラフィックでリスト Duplicate Class:MATによる漏れの原因の自動分析 Shallow heap:オブジェクト自体がメモリを消費するサイズで、参照されるオブジェクトは含まれません.(通常のオブジェクト(非配列)のShallow sizeには、そのメンバー変数の数とタイプが決定されます.配列のshallow sizeには、配列要素のタイプ(オブジェクトタイプ、基本タイプ)と配列長が決定されます.c++のオブジェクト自体とは異なり、javaのオブジェクトメンバーは参照されます.本物のメモリはスタック上にあり、オリジナルのbyte[]の山のように見えます.,char[],int[]なので,オブジェクト自体のメモリのみを見ると数が少ないので,Histogram図はShallow sizeでソートされ,1位と2位はbyte,charである. Retained Heap:オブジェクトが解放されると、そのオブジェクトの解放によって参照が減少し、さらに解放されるすべてのオブジェクト(再帰的に解放されるものを含む)が占有するheapサイズが減少することを示す.(したがって、あるオブジェクトのメンバーnewに大きなint配列がある場合、そのint配列もこのオブジェクトに計算される.Retained heapはshallow heapに対して、オブジェクトが解放される場合、retained heapが解放されるため、オブジェクトが実際に占有するサイズをより正確に反映することができる). outgoing references:オブジェクトのアウトノード(オブジェクトによって参照されるオブジェクト)を表します. incoming references:オブジェクトの入力ノード(オブジェクトに参照されるオブジェクト)を表します. GC Root:GCは、reference chain(参照チェーン)によってオブジェクトにアクセスできないことを発見した場合、そのオブジェクトが回収されます.だからJVMはGC Rootsです. Unreachableとは、ゴミ回収器で回収可能なオブジェクトを指しますが、GCが発生していないため解放されていません.このときにつかむメモリ使用中のUnreachableがこれらのオブジェクトです.
1.プレビュー情報
dumpファイルを開くには、通常、いくつかの重要な情報に注目する必要があります.メモリ占有率グラフ、Actionsセクションの
Paste_Image.png
次のbiggest Objectsをクリックすると、具体的なアドレスが表示されます.Biggest Top Level Dominator Classesもあり、主にメモリを消費しているのは何なのかを見ることができます.
2.dump分析
2.1 Histogram
MATのHistogramの主な役割は、自分が作成したクラスのインスタンスの数を表示するために一般的に使用されるinstanceの数を表示することです.オブジェクトのDominator Treeビューは、異なる次元に分けて表示できます.Groupby class、Groupby class loader、Groupby packageはHistogramと似ていて、時間がかかり、何度も比較することでオーバーフローオブジェクトを見つけることができます.HistogramではGroup,Threadに分けて情報を区別できます.通常、
関連パッケージ名をフィルタリングし、特定のタイプを表示し、objectsの数に注目して、メモリdumpに存在するオブジェクトが変更されていないか、オブジェクトメモリに多すぎる部分があるかなど、メモリdumpにどのくらいの関連タイプのオブジェクトがあるかを示すことで、包括的な分析を行うことができます.
Group by packageを選択することもでき、packageに基づいて分析を容易にすることができます.
Paste_Image.png
また、threadを選択して分析することもできます.これにより、メモリに問題があるスレッドである可能性のあるメモリを最も多く使用するスレッドを表示できます.
右クリックでよく使ういくつかのオプションを選択します. List Objects->with incoming referencesこのオブジェクトがどの外部オブジェクトによって参照されているかを確認する List Objects->with outcoming referencesこのオブジェクトが持つ外部オブジェクト参照 を表示 Path to GC Roots->exclude...referencesこのオブジェクトのGC Rootを表示します.xxx参照は含まれません.残りの基本は強参照です.強いリファレンスのみが存在するため、gcはオブジェクトを回収できず、メモリの漏洩も発生します. Merge shortest path to GC rootは、GCルートノードから1つのオブジェクトまたは1つのオブジェクトのセットへの共通パスを見つけます.ここからオブジェクトの参照関係を表示できます.
2.2 Debug Bitmap
画像はずっとメモリの占有の1つの頭で、メモリの漏洩を引き起こすので、OOMの常連です.だから、画像の分析は非常に理解してこそ、プロジェクトをよりよく最適化することができます.*注意:画像がメモリに消費されるサイズ:ARGB_8888型の画像はメモリ中の画像の幅*メモリ中の画像の高さ4で、ここでは元の画像の幅とメモリの画像の幅が一致しないことに注意する必要があります.ストレッチと圧縮が含まれています.特に、画像の位置が間違っています.例えば、1080 pデバイス、xxshdpiの下に画像がありません.別のディレクトリの下で画像を探しています.このとき、画像はストレッチされます.**画像の処理を見てみましょう.通常dump情報では,画像はBitmap,byte[]の2種類として表現される.この画像がどの画像なのかを知る必要があります.そうすれば、関連する画像コードを最適化することができます. Bitmapタイプmatでは通常bitmapタイプが見られ、次の画像のように大量のメモリを消費し、メモリに2 Mを消費します.開いてmBuffer変数を表示できます. Paste_Image.png
mBuffer->右クリックCopy->Save Value To File->を選択してxxx.dataファイルを生成します. Byte[]タイプは以下の通りで、byteのin commingを表示すると、bitmapであることがわかります.この場合、以下の図のように、byteデータをxxx.dataファイルに直接書き込むことができます. Paste_Image.png
次に、対応するbitmapを選択し、Inspectorウィンドウを開き、bitmapのサイズを確認し、GIMPツール(1つインストール可能、オープンソース)を使用して先ほどのdataファイルを開き、画像タイプはRGB Alphaを選択し、幅と高さで画像の幅と高さを記入し、開ければいいです.
Paste_Image.png
Paste_Image.png
2.3スタックの比較
通常、メモリが漏洩しているかどうか、メモリが増加し続けているかどうか、解放されていないかなどの問題を分析するために、メモリスタックの比較を2回dumpする必要があります.
2つ以上のdumpファイルを開き、Navigation Historyビューを開き、Historgamをクリックし、Add to Compare Basketを選択し、最後にCompare the Resultを選択します.
Paste_Image.png
比較結果では、主な分析タイプまたはオブジェクトの数が変化しているかどうか、メモリが変化しているかどうかを示します.
以上の方法で、メモリの問題の大部分を特定できます.
MATツールはすべてMemory Analyzer Toolと呼ばれ、Javaスタックのメモリを詳しく分析するツールで、このツールは非常に強く、このツールを使用するためにhprofファイルが必要です.
HPROFファイルには、特定の時点、javaプロセスのメモリスナップショットが格納されます.これらのデータを格納するフォーマットは異なり、スナップショットがトリガーされたときにjavaオブジェクトとクラスがheapにある場合が含まれます.スナップショットは一瞬のことなので、heap dumpには、オブジェクトがいつ、どこ(どのメソッドで)割り当てられるかという情報は含まれません.
いくつかの重要な概念:
1.プレビュー情報
dumpファイルを開くには、通常、いくつかの重要な情報に注目する必要があります.メモリ占有率グラフ、Actionsセクションの
Histogram, Top Consumers
です.Top Consumersを開くと、Biggets Objects overviewが表示され、主要なメモリ占有率が表示されます.Paste_Image.png
次のbiggest Objectsをクリックすると、具体的なアドレスが表示されます.Biggest Top Level Dominator Classesもあり、主にメモリを消費しているのは何なのかを見ることができます.
2.dump分析
2.1 Histogram
MATのHistogramの主な役割は、自分が作成したクラスのインスタンスの数を表示するために一般的に使用されるinstanceの数を表示することです.オブジェクトのDominator Treeビューは、異なる次元に分けて表示できます.Groupby class、Groupby class loader、Groupby packageはHistogramと似ていて、時間がかかり、何度も比較することでオーバーフローオブジェクトを見つけることができます.HistogramではGroup,Threadに分けて情報を区別できます.通常、
-> show objects and class -> by incoming reference->merge shortest path to gc root -> exclude weadk reference
などのプロセスで詳細を表示します.関連パッケージ名をフィルタリングし、特定のタイプを表示し、objectsの数に注目して、メモリdumpに存在するオブジェクトが変更されていないか、オブジェクトメモリに多すぎる部分があるかなど、メモリdumpにどのくらいの関連タイプのオブジェクトがあるかを示すことで、包括的な分析を行うことができます.
Group by packageを選択することもでき、packageに基づいて分析を容易にすることができます.
Paste_Image.png
また、threadを選択して分析することもできます.これにより、メモリに問題があるスレッドである可能性のあるメモリを最も多く使用するスレッドを表示できます.
右クリックでよく使ういくつかのオプションを選択します.
2.2 Debug Bitmap
画像はずっとメモリの占有の1つの頭で、メモリの漏洩を引き起こすので、OOMの常連です.だから、画像の分析は非常に理解してこそ、プロジェクトをよりよく最適化することができます.*注意:画像がメモリに消費されるサイズ:ARGB_8888型の画像はメモリ中の画像の幅*メモリ中の画像の高さ4で、ここでは元の画像の幅とメモリの画像の幅が一致しないことに注意する必要があります.ストレッチと圧縮が含まれています.特に、画像の位置が間違っています.例えば、1080 pデバイス、xxshdpiの下に画像がありません.別のディレクトリの下で画像を探しています.このとき、画像はストレッチされます.**画像の処理を見てみましょう.通常dump情報では,画像はBitmap,byte[]の2種類として表現される.この画像がどの画像なのかを知る必要があります.そうすれば、関連する画像コードを最適化することができます.
mBuffer->右クリックCopy->Save Value To File->を選択してxxx.dataファイルを生成します.
次に、対応するbitmapを選択し、Inspectorウィンドウを開き、bitmapのサイズを確認し、GIMPツール(1つインストール可能、オープンソース)を使用して先ほどのdataファイルを開き、画像タイプはRGB Alphaを選択し、幅と高さで画像の幅と高さを記入し、開ければいいです.
Paste_Image.png
Paste_Image.png
2.3スタックの比較
通常、メモリが漏洩しているかどうか、メモリが増加し続けているかどうか、解放されていないかなどの問題を分析するために、メモリスタックの比較を2回dumpする必要があります.
2つ以上のdumpファイルを開き、Navigation Historyビューを開き、Historgamをクリックし、Add to Compare Basketを選択し、最後にCompare the Resultを選択します.
Paste_Image.png
比較結果では、主な分析タイプまたはオブジェクトの数が変化しているかどうか、メモリが変化しているかどうかを示します.
以上の方法で、メモリの問題の大部分を特定できます.