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 回答