[英]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.