2

このコードを Eclipse (Juno) から実行すると OOME がスローされるのに、コマンド ラインから実行すると正常に動作する理由を誰か説明できますか? どちらの場合も -Xmx256M を使用します。

static class Task implements Runnable {
    byte[] buf = new byte[150000000];
    @Override
    public void run() {
    }
}

public static void main(String[] args) throws Exception {
    System.out.println(Runtime.getRuntime().maxMemory());
    ExecutorService ex = Executors.newSingleThreadExecutor();
    ex.submit(new Task()).get();
    ex.submit(new Task()).get();
}

これがEclipseの出力です

259522560
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at Test2$Task.<init>(Test2.java:7)
    at Test2.main(Test2.java:17)

ノートブックで実行しましたが、他の PC でどのように動作するかはわかりません。

4

1 に答える 1

1

-- 元の応答 -- Eclipse は 256M で実行されていますが、アプリの実行構成を編集して、起動したアプリケーションにも 256aM を与えましたか? そうでない場合は、デフォルトのヒープで実行されます。

-- 質問が更新された後の更新 --

以下のコードをテストしましたが、Eclipse と外部で問題なく動作します。

OOME は最初の実行時に発生しますか (たとえば、次の出力は何をしますか?)、割り当ての位置を変更すると何かに影響しますか?:

public class Test {
    public static class Task implements Runnable {
        byte[] buf;
        int id;
        public Task(int i) {
            id = i;
        }

        @Override
        public void run() {
            buf = new byte[150000000];
            System.out.println("hi " + id);
        }
    }

    public static void main(String[] args) throws Exception {
        System.out.println(Runtime.getRuntime().maxMemory());
        ExecutorService ex = Executors.newSingleThreadExecutor();
        ex.submit(new Task(1)).get();
        ex.submit(new Task(2)).get();
    }
}
于 2012-11-25T06:27:33.837 に答える