java - 如何通过多线程java编程最大化资源(RAM和CPU)使用率?

标签 java multithreading memory-management jvm java.util.concurrent

我的代码在 Windows 2008 Server(64 位)上的 32 位 JVM (JRE v1.6) 上运行,具有 128 GB RAM 和 64 个内核。但是,我可以指定的最大堆空间是 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 中有逻辑来确定要创建多少个进程,并等待这些进程完成后再生成新进程)。

感谢任何帮助。

最佳答案

选项:

  1. 切换到 64 位 JVM。
  2. 运行大量 32 位 JVM,每个 JVM 执行必须完成的工作的子集。

关于java - 如何通过多线程java编程最大化资源(RAM和CPU)使用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18340368/

相关文章:

ruby 线程 : how to join threads from different places so that they are concurrent?

delphi - 销毁 TReader 时出现异常

java内存选项

multithreading - dlclose 时共享库产生的线程会发生什么

Java apache.commons.pool : How to set a maximum idle time for the objects from the pool?

java - 如何使用通用图像加载器在 ImageView 中设置图像适合 XY 而不会划伤?

java - saxon-xpath-9.1.0.8.jar!/META-INF/services/javax.xml.xpath.XPathFactory :2: Illegal configuration-file syntax

c++ - boost asio 在线程中运行 io_service

java - log4j:在生产/开发中对标准输出文件/控制台的不同使用

java - 任务完成后如何在java中销毁线程