繁体   English   中英

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

[英]Why ThreadPoolExecutor behaves differently when running Java program in Eclipse and from command line?

谁能解释为什么我从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上的运行情况。

-原始响应-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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM