NetBeansのメモリ使用量グラフからわかること

NetBeansでは、メニューの「表示 > ツールバー > メモリー」でメモリ使用状況をツールバーに表示させることができます。


けど、ここでは、もう少し詳しくメモリの使用状況を見るために、JConsoleを使いましょう。JConsoleは、Javaのプログラムの実行状況を見るための管理ツールです。

JConsoleプラグインのインストール

JConsoleを使うには、JAVA_HOME/bin/jconsole.exeなどを起動すればいいのですが、せっかくなのでNetBeansからJConsoleを起動できるように、プラグインを入れてみましょう。


メニューの「ツール > プラグイン」を選択してプラグインダイアログを開いて、「使用可能なプラグイン」のタブから「JConsole」を選択してインストールしましょう。


そうすると、JConsole起動ボタンがツールバーに表示されるので、クリックしてみます。


JConsoleが起動すると、接続先のJavaプログラムを選択するダイアログが表示されます。ここでは、どれがNetBeansがよくわからないですが、消去法でなにも書いてないのがNetBeansだということになりました。ということで、タイトルのない行を選んで「接続」ボタンを押します。


しばらくするとNetBeansに接続して実行状況が表示されるようになります。今回はメモリ状況を見たいので、「メモリ」タブを開きます。

Javaのメモリ管理

Javaでは、世代別GCというやりかたでメモリ管理が行われています。おおざっぱにいうと、メモリ領域を一時的に使うオブジェクトの領域とずっと使うオブジェクトの領域にわけて、頻繁にGCを行うのは一時的に使うオブジェクトの領域だけにして、ずっと使うオブジェクトの領域のGCはたまにだけ行うというものです。
そのため、メモリのグラフはギザギザになって、たまに大きく落ち込むというようになっています。ギザギザのところが一時的に使うオブジェクトの領域のGCで、大きく落ち込んでいるのがずっと使うオブジェクトの領域のGCですね。


右下のグラフでは、一番左がずっと使うオブジェクトの領域、左から2番目と3番目が一時的に使うオブジェクトの領域です。

追記 2011/2/19 11:59
Concurrent GCを使う設定にしてたので、通常とはグラフが違いました。
なにも設定してない状態だと、次のようになります。


一番左と2番目が一時的に使うオブジェクトの領域、3番目がずっと使うオブジェクトの領域ってことになります。
下の『左から3番目の「Par Survivor Space」』というのも『左から2番目の「Survivor Space」』です。
Concurrent GCの設定方法は、NETBEANS_HOME/etc/netbeans.confにコメントで書いてあるんで、そのとおりにしてみてください。

NetBeansがメモリをやたら食うときの対策

もし、NetBeans上でなにもしてないのに、ギザギザしながらメモリ使用量が増えていくというときには、一時的に使うオブジェクトの領域が狭すぎることが考えられます。左から3番目の「Par Survivor Space」が頻繁にいっぱいになるようなら、設定を変更したほうがいいです。


NetBeansをインストールしたディレクトリのetc/netbeans.confというファイルを編集して、「netbeans_default_options」の行に「-J-XX:MaxNewSize=24m」などとしてメモリの割り当てを増やしておいたほうがいいでしょう。ついでに「-J-server」を記述していなかったら追加してください。NetBeansの全体的なメモリ使用量ががっくり減り、動作もたぶん速くなります。

それよりもメモリ使用量からわかる大事なこと

ところで、NetBeans上でなにもしなければ、メモリのグラフはギザギザしながら真横にのびます。
さっきのグラフをもう一度みてみましょう。


時間みにくいかもしれませんが、6:45くらいまではずっとギザギザしながら真横にのびています。6:10手前でがっくり落ちてるのはGCが行われたからですね。
さっき書いたように、メモリ使用量のグラフがギザギザしながら真横にのびているということは、NetBeans上でなにもしていないということです。つまり仕事をしていないということです。仕事をしていないということです。


このグラフから読み取れることは、6:45まで何か別のことをしてて、6:45から7:00くらいまで思い出したように作業し、7:00から7:25まで作業の手をおき、7:25から7:40までまたなにか作業をしたということですね。6:45くらいまでは、なんかだらだらしてました。でちょっと作業をして7:00から買い物にでかけ、7:20くらいに帰ってきて、またちょっと作業をしてそのまま休憩って感じですね。
こんなことがNetBeansのメモリ使用量のグラフからわかってしまうのです。


ということで、NetBeansのメモリ使用量のグラフを見ると、仕事してないことがバレるというお話でした。