OpenJ9 JVM の heap dumpをMemory Analyzerで解析する

:::note info
2024/12/24 セクションのインデントずれ修正
2023/11/20 新規作成
:::

#### 経緯・課題
・業務で java heap dump の仕様を調査する必要があり、memory analyzerをMacOSに導入したので備忘録として残しておきます。

---
#### 前提・環境など
・MacOS Sonoma (14.1) Apple M1 Pro
・java jdk-17.0.8.1+1 (IBM OpenJ9)

---
#### 参考知識

・[IBM SDK, Java Technology Edition 8 - 診断ツールおよびデータ](https://www.ibm.com/docs/ja/sdk-java-technology/8?topic=component-diagnostic-tools-data)


---
#### 1.二種類のMATツール
　Memory Analyzer tool (MAT)は２種類利用方法があります。
　・Eclipse版
　　Eclipseを普段から利用している場合、Eclipseにプラグインとして追加することが可能です。

　・スタンドアロン版
　　単純にMATだけ手っ取り早く使いたい、という方はこちらがおすすめです。

##### 1-1.Eclipse版
###### 1-1-1.　Market Placeからの導入
　ここでは、Eclipse導入済みの前提で記載します。

　Help > Eclipse Marketplace  を選択し、Memory Analyzer x.xx.x を検索、導入します。
　(図は、Memory Analyzer 1.13.0 を導入済みの場合
　
 　　<img width=500 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/bc01a261-7629-bf40-feb8-4408f4cbaf6b.png>

  Eclipseを再起動すると、Help > Memory Analyzer Diagnostics... が利用可能になります。
　　　<img　width=300 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/c516b0d9-3efb-d92e-b2a2-fcc1d6819f13.png>

　さらに、右上のパースペクティブ選択ボタンから、Memory Analyzer のパースペクティブの利用が可能になります。
　　　<img width=300 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/b4d732e1-1a1b-b773-0a4d-237883b5fcf4.png>

　Memory Analyzer のパースペクティブに切り替えた後、以下のように "Open Heap Dump"が選択できるようになります。
　　　<img width=300 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/b17be0ad-8c78-2105-e78c-d5cb806ec9a6.png>

  


###### 1-1-2.java sdk home 設定
　
　
　eclipse もしくはMATが起動できない場合、以下のようにします。
　パッケージの内容を表示して、Info.plist ファイルの内容を書き換えます。
　　<img width=450 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/d19cbd34-c8dc-f6de-966e-98d2e463ad78.png>

　以下のように、各自の$JAVA_HOMEに応じて、JDKのパスを記載します。
　　<img width=600 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/6d24a835-3784-de84-b569-92d42ddcc095.png>



　　[参考: Not able to run Eclipse on macOS Big Sur](https://stackoverflow.com/questions/62647625/not-able-to-run-eclipse-on-macos-big-sur)
 
##### 1-2.スタンドアロン版
###### 1-2-1.ダウンロード
　　IBM サイトからダウンロードできます。
　　[Memory Analyzer (MAT)](https://www.ibm.com/support/pages/eclipse-memory-analyzer-tool-dtfj-and-ibm-extensions)
　　dump heapの Java versionに依存して２種類あります。
  ・IBM Java 8
  ・IBM Semeru Runtimes Java (IBM Java 8の後継)

　　その他、サイトの手順に従ってtarを解凍します。


---
#### 2.OpenJ9 JVMのdumpを解析するための設定

　(この手順は、上記IBMサイトからDLしたスタンドアロン版では不要です。)
　ここでJVMの種類について述べておきます。JVMは、Java 仮想マシンといい、各OSの上でJava バイナリコードを翻訳・実行するための仲介をするソフトウェアです。いくつか種類があり、HotSpot 、OpenJ9などのJVMがあります。これらはガベージコレクションの挙動や、heap内部の構造が異なります。OpenJ9版のJVMが出力したheapを解析できるよう、対応したプラグインを導入する必要があります。
　
　ちなみに、Hotspot JVM で出力されるheap dumpの拡張子は.hprof、OpenJ9 JVM で出力されるheap dumpの拡張子は.phd (portable heap dump)となります。

　下図のように、Install New Softwareを選択します。

　　<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/550355d4-63ba-d773-3e8e-31fa9beec927.png>
　
 
 "IBM Diagnostic Tool Framework for Java" を検索し、導入します。

　　<img width=700 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/07884287-b561-c58b-71f4-8583faa1cdfd.png>

  十分以上かかります。
　　<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/0799b51e-23dc-d4be-0fa4-6058af426d21.png>

<img width=500 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/4a0d8162-03aa-666d-9d34-7f6d831b6ce1.png>


　
 [参考：IBM SDK, Java Technology Edition 8 - Heap dump](https://www.ibm.com/docs/en/sdk-java-technology/8?topic=dumps-heap-dump#analyzing-dumps)






  
　これで、.phd拡張子のファイルも読み込みできるようになりました。