Javaのメモリーはガーベジ・コレクタが管理するため,アプリケーション側ではそれほど気にするありません。しかし,全く気にしないわけにはいかないのも実情です。

小さいアプリケーションでは無頓着であっても構いませんが,大規模になればそうもいってはいられません。使用メモリー量,ガーベジ・コレクション(GC)の頻度,リークの有無などは,できればチェックしておきたい項目です。

Javaではメモリーを複数の領域に分割して管理しています。クラス定義やメソッドなどのデータが格納されるPermanent領域や,インスタンスが割り当てられるヒープなどがあります。このような領域がどのように使用されているかを知ることは,パフォーマンスを考えるうえでもとても重要になります。

ここでは,特にヒープに着目していきたいと思います。

ヒープの使用量を知る

まずはヒープの使用量がどのくらいになっているかを調べてみましょう。

アプリケーションの中でヒープの使用量を調べるにはいくつかの方法があります。

J2SE 1.4以前の場合,java.lang.RuntimeクラスのmaxMemoryメソッドとfreeMemoryメソッドを使用します(もちろん,Java SE 5.0でも使用できます)。

  Runtime runtime = Runtime.getRuntime();
	
  long max = runtime.maxMemory();
  long free = runtime.freeMemory();
  long used = max - free;

Java SE 5.0であれば,より詳細な情報を取得することもできます。

それは,2月にご紹介したMXBeanを使用する方法です。MXBeanには9種類ありますが,ヒープの使用量を知るにはjava.lang.management.MemoryMXBeanクラスを使用します。

MemoryMXBeanクラスではjava.lang.management.MemoryUsageクラスを使用してメモリーの使用量を表します。MemoryUsageクラスは四つのプロパティを持っており,それぞれ下表のような意味を持っています。これらプロパティの型はすべてlongです。

プロパティ 説明
init Java VMが起動時にOSに要求するメモリー量。設定されていない場合,0になる
used 現在使用しているメモリー量
committed Java VMが現在使用することを保証しているメモリー量。メモリーの使用状況により増減するが,必ずused以上,max以下になる
max Java VMが使用できる最大メモリー量
Standard MBean
MemoryUsageのプロパティ

ヒープの場合,initはjavaの起動オプションの-Xmsに相当し,maxは-Xmxに相当します。

MemoryMXBeanクラスをアプリケーション中で使用するには以下のようなコードを使います。

  MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
  MemoryUsage heapUsage = mbean.getHeapMemoryUsage();
  
  long init = heapUsage.getInit();
  long used = heapUsage.getUsed();
  long committed = heapUsage.getCommitted();
  long max = heapUsage.getMax();

ManagementFactoryクラスはMXBeanを取得するために使用するクラスで,他のMXBeanもこのクラスを使用して取得することができます。

ソースコード中に上記のコードを埋め込むことができなくても,JMXを利用して外部からメモリー使用量を参照することもできます。ここではJDKに付属しているjconsoleを使用し,同様にJDKに付属しているサンプルであるJava2Demoのヒープ使用量を参照してみましょう。

Java2DemoはJDKがインストールされたディレクトリ以下のdemo/jfc/Java2Dディレクトリにあります。

JMXを使用してMXBeanを参照する場合,javaの起動時オプションとして-Dcom.sun.management.jmxremoteを使用します。詳しくはJava SEのドキュメント「JMX を使用する監視と管理」と「jconsoleの使用」を参照してください。

> java -Dcom.sun.management.jmxremote -jar Java2Demo.jar

Java2Demoが起動できたら,jconsoleを起動します。

jconsoleを起動すると,アタッチできるJavaのアプリケーションの一覧がダイアログで表示されるので,その中からJava2Demo.jarを選択して,「接続」ボタンを押します。

jconsoleのウィンドウの上部にはタブが並んでいます。その中の「メモリー」タブを選択するとヒープメモリーのトレンドが表示されます。ウィンドウの左下の部分には,MemoryUsageクラスのused,committed,maxの値が,それぞれ「使用済み」,「確定」,「最大」として表示されています。

jconsole
jconsoleでヒープ使用量を参照する

簡単にヒープの使用量がわかるので,ぜひやってみてください。

来週は,ヒープと切っても切り離せない関係にあるガーベジ・コレクションについて解説します。

著者紹介 櫻庭祐一

横河電機の研究部門に勤務。同氏のJavaプログラマ向け情報ページ「Java in the Box」はあまりに有名