【发布时间】:2013-08-20 16:31:54
【问题描述】:
我的代码在具有 128 GB RAM 和 64 个内核的 Windows 2008 Server(64 位)上的 32 位 JVM (JRE v1.6) 上运行。但是,我可以指定的最大堆空间是 1.5 GB。我的代码如下所示。
int numThreads = Runtime.getRuntime.availableProcessors();
List<Callable<Long>> tasks = new ArrayList<Callable<Long>>();
File dir = new File("/path/to/data");
File[] dataFiles = dir.listFiles();
for(File dataFile : dataFiles) {
MyTask task = new MyTask(dataFile);
tasks.add(task);
}
ExecutorService executor = Executors.newFixedThreadPoll(numThreads);
List<Future<Long>> results = executor.invokeAll(tasks);
long total = 0L;
for(Future<Long> result : results) {
total += result.get();
}
System.out.println("total = " + total);
executor.shutdown();
此代码引发 OutOfMemoryError。我所做的是将线程数更改为更小。
int numThreads = Runtime.getRuntime.availableProcessors();
if(numThreads < 1 || numThreads > 4) {
numThreads = 4;
}
这个修改后的代码还没有抛出 OutOfMemoryError,但是,这让我很失望,因为有很多资源(RAM 和 CPU 资源)没有被使用。如何在我的环境中最大限度地利用资源?
最重要的是,我想要一些关于 1.5 GB 最大堆空间限制的解决方法的反馈。请注意, Callable
我考虑过创建一个 DOS bat 文件来遍历我的输入文件,然后简单地调用
java -cp %CP% -Xms1024m -Xmx1536m net.analysis.MyProg %1
但这似乎有点古怪/笨拙(现在我必须在 DOS bat 中有逻辑来确定要创建多少进程,并等待这些进程完成后再生成新进程)。
感谢任何帮助。
【问题讨论】:
-
这个问题和你上一个问题的答案一样。我觉得你缺少一些东西,但我不知道为什么。
-
@PeterLawrey 它不完全相同,但它是相关的。我打算在那个线程上发帖,但我已经将该线程标记为已回答。这个线程处理“解决方法”,而前一个线程处理理解内存限制。
-
我能想到的所有解决方法都涉及安装 64 位版本的 Java,这也是解决方案。如果我是系统管理员并且我购买了 128 GB 的机器,我会坚持使用 64 位应用程序,否则这会使机器变得毫无意义。如果您的 IT 不明白这一点,那么您就有一个非常基本的问题。
标签: java multithreading memory-management jvm java.util.concurrent