gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:09:52 33 4
gpt4 key购买 nike

我的代码在 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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com