@ITより。
Javaのメモリ消費量について調査する際にWindowsのタスクマネージャでJava VMの使用しているメモリ量を
見ても駄目だという話。
メモリリークの調査だとか、使用する資源量の調査だとか、いろいろな理由があってメモリ消費量を
計測したいという話はあちこちで見かけます。ことJavaの場合、メモリはOSから直接供給されるのではなく
VMが間に入って管理を行うためOSからプロセスの消費しているメモリ量を見ても実態がつかめないことを
まず理解せねばなりません。
オブジェクトがGCされてもメモリ消費量が減らない!と騒ぐ前に
JavaのVMはメモリが必要になったときにその都度OSにメモリを供給してもらうわけではありません。
ある程度まとまった量のメモリをOSから貰い、それをプールとして、オブジェクトがnewされるたびに分割して供給するわけです。
そして、オブジェクトの参照がなくなってGC(ガーベッジコレクション)によって回収された場合にも、
プールに戻すだけでOSに細かく返していくわけではありません。
そのため、オブジェクトを作ったり解放したりを繰り返しているJavaプログラムを動かしていても、
Windowsのタスクマネージャから見るとメモリ量は変わらないことがあります。
タスクマネージャから見ているのはVM全体が確保しているメモリだからです。
JavaのVM内でのメモリの使用状況を確認するには
簡素な方法としては、
java.lang.Runtime#freeMemory()を使う手法です。
この値をSystem.out.println()で出力することで、そのときの空き容量を得られますから
コードを直接いじりながらデバッグしているような段階では手軽に計測できますね。
ツールを使う場合は
jconsole
を用います。これはJDKに付属しているツールですので別途ダウンロードする必要はありません。
投稿日時 : 2007年12月4日 15:30