S-JIS[2008-08-10/2010-06-27] 変更履歴

Javaメモリー関連メモ

  • 実行時のメモリーサイズを増やす方法

GC

GCは、garbage collectionあるいはgarbage collectorの略。
日本語訳は「ガベージ」「ガーベジ」「ガーベッジ」「ガーベージ」だの色々書かれるので、どれが一番普及した表記なのかよく分からない(苦笑)
Y-ADAGIOのJava訳語では「ガーベジ」、SunのAPIのJavadocwikipediaでは「ガベージ」と書いているが、自分は「ガーベッジ」と言ってきたので、それを使うことにする。
そもそも全部カタカナで書く/言うと長いので、GC(ジーシー)って略しちゃうのだが^^;

Javaでは、生成したインスタンスをGC(ガーベッジコレクター)が管理している。
どこからも参照されなくなった(つまり使われなくなった)インスタンスが使っていた領域(メモリー)はGCによって解放・回収され、別のインスタンス生成で使えるようにする。この動作をGC(ガーベッジコレクト)と呼ぶ。
こういう仕組み全体の事をGC(ガーベッジコレクション)と呼ぶ。

弱参照オブジェクト


GC(ガーベッジコレクト)が発生するタイミングはJavaVM(ガーベッジコレクター)の任意なので、いつ発生するか分からない。
System.gc()によってプログラマーがGCを発生させることは出来る。が、普通はあまり使わない。

GCが発生してオブジェクトが解放されるときにfinalize()メソッドが呼ばれる。


GCの種類(実装)も色々あり、JDKのバージョンアップに伴って改良されているし、サードパーティー製のJRE(WebLogicでも使われているJRockitとか)にとっても腕の見せ所だろう。

Sunのjavaコマンドには、-server-clientという、どういうGCを行うか(?)指定するオプションがある。
また、-verbose:gcでGCの状態を表示させることが出来る。


参考:

ITpro 「メモリーを意識してみよう」第2回 GCの仕組みを理解する 2006-06-12 2008-08-10
日本HP Javaのかなめ、「ガベージ・コレクション」をやさしく学ぶ・前編
Javaのかなめ、「ガベージ・コレクション」をやさしく学ぶ・後編
2007-02 2010-06-27

メモリー使用量

実行中のJavaアプリケーションがどれくらいのメモリを使用しているかは、以下のメソッドで確認できる。[2006-11-09]

	Runtime runtime = Runtime.getRuntime();
	System.out.println("総容量  " + runtime.totalMemory());
	System.out.println("最大メモリ" + runtime.maxMemory());
	System.out.println("空きメモリ" + runtime.freeMemory());
メソッド 概要
Runtime#totalMemory() JavaVMのメモリの総容量
Runtime#maxMemory() JavaVMが使用しようとする最大メモリ容量
Runtime#freeMemory() JavaVM内の空きメモリ容量

ただし、JNIでnativeメソッド(WindowsならDLL内の関数)を呼び出している場合、メモリは別管理される。[2007-03-26]
すなわち、上記のメソッドをJNI呼び出し元で使用した場合、呼出元のメモリしか取得できない。

それらも含めた全体を知りたい場合、Windowsならtasklistでプロセス全体の使用量を見ることが出来る。


JDK1.5では、MemoryUsageクラスのメソッドも使える。[/2008-08-10]

	MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
	MemoryUsage usage = mbean.getHeapMemoryUsage();

	System.out.printf("初期サイズ:%10d%n", usage.getInit());
	System.out.printf("使用サイズ:%10d%n", usage.getUsed());
	System.out.printf("保証サイズ:%10d%n", usage.getCommitted());	//JavaVMが使用できる最大サイズ
	System.out.printf("最大サイズ:%10d%n", usage.getMax());	//理論上の最大限使用可能なサイズ

参考:


(Windowsの場合)javaコマンドが動いているコンソール上でCtrl+Break(Pauseキー)を押すと、スレッドダンプが標準出力(つまりコンソール上)に出力される。

この末尾にメモリーの使用量が表示されている。


Java目次へ戻る / 新機能へ戻る / 技術メモへ戻る
メールの送信先:ひしだま