IntelliJ IDEAのプロファイラを使ってみた

GMOアドマーケティングのT.Oです。

IntelliJ IDEA Ultimateでプロファイラを使ってみましたので利用手順についてご紹介します。
お手軽に使用できます:grinning:

●前提
開発環境としてmac版のIntelliJ IDEA Ultimate 2019.3を利用します。
注1) IntelliJのプロファイラはUltimate版のみで使用可能です
注2) 現時点ではプロファイラの機能はtomcatなどのアプリケーションサーバーには使えません

# 1.プロファイラ機能の有効化
IntelliJのメニューから「Preference→Build,Execution,Deployment→Profilers→Java Profiler」を選択します。「+」ボタンを押して「CPU Profiler」, 「Allocation Profiler」を追加します。
<img width="721" alt="profiler_p1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36602/3b07288b-b196-f688-aab3-415a30e1f26b.png">

プロファイラを実行するためのボタンが追加されます。
<img width="596" alt="profiler_p2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36602/99dd1cdd-07d7-8495-3562-dde5c8b8fc19.png">

# 2.プロファイラを使う

## 2.1. CPUプロファイラ
プロファイラを実行するボタンのうち、「Run 'xxxxx' with CPU Profiler」を選択します。プログラムが実行された後に、画面の「Profiler」タブを選択するとプロファイラーツールウィンドウが表示されます。収集されたデータがフレームグラフ、コールツリー、メソッドリストの3つのタブに表示されます。

### 2.1.1. フレームグラフ
CPUの消費時間の割合に比例した幅で呼び出されたスタックのフレームが表示されます。オレンジの部分がプログラムで記述された部分の呼び出しによって消費されているところ、ブルーの部分がコンパイル時間などで消費されているところになっているようです。
<img width="1296" alt="profiler_cpu_p1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36602/60dcd764-6343-263c-4e0b-67b7911d5150.png">
消費時間の割合が多いところを調査したい場合は、フレームを選択した状態でメニューを表示して「Jump To Source」を選ぶとそのフレームの部分に該当するプログラムソースに移動することができます。
<img width="980" alt="profiler_cpu_p1-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36602/7558206f-af52-a446-a76b-664110c747e8.png">

### 2.1.2. コールツリー
プログラムの呼び出しスタックに関する情報（メソッド名、合計CPU消費時間の割合など）が表示されます。
左端の矢印は階層表示になっていて、選択するとより詳細に確認することができます。
<img width="1296" alt="profiler_cpu_p2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36602/c2e3a57a-a3d9-6303-4ff3-6b0ff6e34cfb.png">

### 2.1.3. メソッドリスト
実行されたメソッドが累積のCPU消費時間の割合の多い順に表示されます。それぞれのメソッドを選択した状態で下部の「Back Traces」を選ぶと、呼び出し元になっているメソッドを確認することができます。
<img width="1295" alt="profiler_cpu_p3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36602/284ba18d-f68f-4aa8-b1b2-ff08e0f639e6.png">

## 2.2. アロケーションプロファイラ
プロファイラを実行するボタンのうち、「Run 'xxxxx' with Allocation Profiler」を選択します。プログラムが実行された後に、画面の「Profiler」タブを選択するとプロファイラーツールウィンドウが表示されます。
収集されたデータがフレームグラフ、コールツリー、メソッドリストの3つのタブに表示されます。

### 2.2.1. フレームグラフ
メモリ消費の割合に比例した幅で呼び出されたスタックのフレームが表示されます。メモリ消費量が多いところを調査したい場合は、フレームを選択した状態でメニューを表示してメニューから「Jump To Source」を選ぶとそのフレームの部分に該当するプログラムソースに移動することができます。
<img width="1390" alt="profiler_allocation_p1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36602/176558eb-f8b6-803f-0471-3756454f4467.png">

### 2.2.2. コールツリー
プログラムの呼び出しスタックに関する情報（メソッド名、合計メモリ消費量の割合など）が表示されます。
<img width="1395" alt="profiler_allocation_p2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36602/e9f3e279-7ea0-802c-460f-6ec5a3dfef18.png">
左端の矢印は階層表示になっていて、選択するとより詳細に確認することができます。
<img width="1395" alt="profiler_allocation_p3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36602/35b13e09-8363-84a8-ca5a-27d43617f1f2.png">

### 2.2.3. メソッドリスト
実行されたメソッドが累積のメモリ量で多い順に表示されます。それぞれのメソッドを選択した状態で下部の「Back Traces」を選ぶと、呼び出し元になっているメソッドを確認することができます。
<img width="1395" alt="profiler_allocation_p4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36602/59da85fc-24a5-f764-68a5-74b9b8665893.png">

# 参考
執筆にあたり以下を参考にさせていただきました。
[プロファイリング・ツール - 公式ヘルプ | IntelliJ IDEA]
(https://pleiades.io/help/idea/cpu-profiler.html)

明日は、@CodeDiggerMさんによる「機械学習で欠損値の対応法」です。
引き続き、[GMOアドマーケティング Advent Calendar 2019](https://qiita.com/advent-calendar/2019/gmo-am)をお楽しみください！