OutOfMemoryError は catch 出来る2009年08月20日 01時06分50秒

長らくの間 OutOfMemoryError はcatch 出来ないと思っていた。しかし、実際の所はこの認識は間違いであった。

簡単な実験プログラムを書いてみる。


% cat OutOfMemoryTest.java
import java.util.*;
public class  OutOfMemoryTest
{
    public static void main(String[] args)
    {
        try
        {
            List l = new LinkedList();
            while(true)
                l.add(new byte[1024 * 1024]);
        }
        catch(OutOfMemoryError e)
        {
            System.err.println("Catched");
            e.printStackTrace();
        }
}

コンパイルし、実行する。

% javac OutOfMemoryTest.java
% java OutOfMemoryTest
Catched
java.lang.OutOfMemoryError: Java heap space
        at OutOfMemoryTest.main(Main.java:10)

OutOfMemoryError を捕捉出来ているのが分かる。

なぜ、前回は駄目だったのかは、画像処理でのメモリ不足を捕捉しようとしていたからだった。画像関連は最終的に sun.awt.image.* のクラスが呼ばれる。このクラスがスレッドを生成して処理を行なっていた為、メモリ不足でエラーが出たときには既に自分の制御下になかったからだった。