OutOfMemoryError
日本語 | 容量範囲外異常 |
英語 | out of memory error |
ふりがな | あうとおぶめもりーえらー |
フリガナ | アウトオブメモリーエラー |
J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.lang.OutOfMemoryError。
実行中にメモリが足りなくなった場合に投げられるクラス。Errorクラスのサブクラスのため厳密には例外ではない。
大きなサイズ・量の変数・インスタンス作成し、ガベージコレクションによる解放が間に合わない場合に発生する。
メモリのサイズはjavaコマンドの実行時に-mx等のオプション等で変更できるが、それでも対応できない場合もある。また、アプリケーションサーバー等の場合には、これらのオプションが使用できない場合もある。
基本的にはプログラムのバグになるが、マシンの環境が変わることで発生したり、最終段階での総合テストで発生したりすることが多く、また原因を特定しにくいため解決が難しい。
解決方法としては、close()メソッドを呼ばなければならないクラスは必ずfinallyの中でclose()を呼ぶ、配列のサイズが大きすぎないようにする、ループ等でインスタンスを作らず使い回すようにする、等の措置が必要となる。
ただし、Javaでは、メモリの解放はガベージコレクションによって行われるため、確実性が伴わないこともある。場合によっては設計レベルでの全体的な見直しが必要な場合もあるだろう。
実行中にメモリが足りなくなった場合に投げられるクラス。Errorクラスのサブクラスのため厳密には例外ではない。
大きなサイズ・量の変数・インスタンス作成し、ガベージコレクションによる解放が間に合わない場合に発生する。
メモリのサイズはjavaコマンドの実行時に-mx等のオプション等で変更できるが、それでも対応できない場合もある。また、アプリケーションサーバー等の場合には、これらのオプションが使用できない場合もある。
基本的にはプログラムのバグになるが、マシンの環境が変わることで発生したり、最終段階での総合テストで発生したりすることが多く、また原因を特定しにくいため解決が難しい。
解決方法としては、close()メソッドを呼ばなければならないクラスは必ずfinallyの中でclose()を呼ぶ、配列のサイズが大きすぎないようにする、ループ等でインスタンスを作らず使い回すようにする、等の措置が必要となる。
ただし、Javaでは、メモリの解放はガベージコレクションによって行われるため、確実性が伴わないこともある。場合によっては設計レベルでの全体的な見直しが必要な場合もあるだろう。
参考サイト
// Sample.java
public class Sample
{
public static void main( String[] args )
{
try
{
// 大きな配列を作ってOutOfMemoryErrorを発生させます。
long[] longs = new long[10000000];
}
catch( OutOfMemoryError e )
{
e.printStackTrace();
// java.lang.OutOfMemoryError
}
}
}
public class Sample
{
public static void main( String[] args )
{
try
{
// 大きな配列を作ってOutOfMemoryErrorを発生させます。
long[] longs = new long[10000000];
}
catch( OutOfMemoryError e )
{
e.printStackTrace();
// java.lang.OutOfMemoryError
}
}
}
// Sample.java public class Sample { public static void main( String[] args ) { try { // 大きな配列を作ってOutOfMemoryErrorを発生させます。 long[] longs = new long[10000000]; } catch( OutOfMemoryError e ) { e.printStackTrace(); // java.lang.OutOfMemoryError } } }