为什么ThreadPoolExecutor在Eclipse和命令行中运行Java程序时的行为不同?

时间:2012-11-25 06:20:28

标签: java eclipse out-of-memory threadpoolexecutor

当我从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上的表现。

1 个答案:

答案 0 :(得分:1)

- 原始回复 - Eclipse以256M运行,但您是否编辑了应用程序的运行配置以便为启动的应用程序提供256aM?如果没有,它将使用默认堆运行。

- 更新问题后更新 -

我测试了下面的代码,它在日食和外面运行良好。

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();
    }
}