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が使用できる最大メモリー量 |
![]() |
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の値が,それぞれ「使用済み」,「確定」,「最大」として表示されています。
簡単にヒープの使用量がわかるので,ぜひやってみてください。
来週は,ヒープと切っても切り離せない関係にあるガーベジ・コレクションについて解説します。
著者紹介 櫻庭祐一 横河電機の研究部門に勤務。同氏のJavaプログラマ向け情報ページ「Java in the Box」はあまりに有名 |