Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过多线程java编程最大限度地利用资源(RAM和CPU)?_Java_Multithreading_Memory Management_Jvm_Java.util.concurrent - Fatal编程技术网

如何通过多线程java编程最大限度地利用资源(RAM和CPU)?

如何通过多线程java编程最大限度地利用资源(RAM和CPU)?,java,multithreading,memory-management,jvm,java.util.concurrent,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

我的代码运行在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();
但这似乎有点奇怪/笨拙(现在我必须在DOS bat中使用逻辑来确定要创建多少进程,并等待这些进程完成后再生成新进程)


非常感谢您的帮助。

32位JVM的最大堆空间约为1.5GB。当然,您必须切换到64位操作系统上运行的64位JVM,以分配更多资源。这是32位JVM使用32位地址这一事实的直接结果。64位JVM可以访问大约20亿到40亿倍于32位JVM的堆空间。

32位JVM的最大堆空间约为1.5GB。当然,您必须切换到64位操作系统上运行的64位JVM,以分配更多资源。这是32位JVM使用32位地址这一事实的直接结果。64位JVM可以访问大约是32位JVM的20到40亿倍的堆空间。

选项:

  • 切换到64位JVM
  • 运行一整套32位JVM,每个JVM执行必须完成的工作的一个子集
  • 选项:

  • 切换到64位JVM
  • 运行一整套32位JVM,每个JVM执行必须完成的工作的一个子集

  • <>你为什么不考虑NealCaseDeTeCube()。我认为它应该很适合你的要求和限制。 它会创建一个线程池,根据需要创建新线程,但会在以前构建的线程可用时重用这些线程。这些池通常会提高执行许多短期异步任务的程序的性能。执行调用将重用以前构造的 线程(如果可用)。如果没有可用的现有线程,将创建一个新线程并将其添加到池中。在六十秒钟内未使用的线程将被终止并从中删除 缓存。因此,闲置足够长时间的池不会消耗任何资源


    检查API文档以获得更多信息

    为什么不考虑NealCaseDeTeCube()。我认为它应该很适合你的要求和限制。 它会创建一个线程池,根据需要创建新线程,但会在以前构建的线程可用时重用这些线程。这些池通常会提高执行许多短期异步任务的程序的性能。执行调用将重用以前构造的 线程(如果可用)。如果没有可用的现有线程,将创建一个新线程并将其添加到池中。在六十秒钟内未使用的线程将被终止并从中删除 缓存。因此,闲置足够长时间的池不会消耗任何资源


    查看api文档了解更多信息

    是的,我知道。但是请注意这样一个事实:在这种环境下进行任何更改都是一场与官僚地雷的政治斗争。增加JVM可用的堆内存没有其他选择。这是32位体系结构的寻址限制。这就是64位体系结构存在的原因。那么这就是一个政治问题——在您的案例中,没有一个可以通过技术来规避。接受由于局限性而导致的糟糕运行-只需向责任方指出问题并解释解决方案。然后这就成了他们的问题,每当有人来抱怨软件的性能时,他们就会指出(记录在案的)问题。如果这不能让你得到结果。。。“真的,换公司。”詹尼韦恩说,“所以你们的问题实际上是政治问题,而不是技术问题,所以我们不能帮助你们。您不能更改32位程序的模拟方式,如果可以,您也不想更改。@Durandal所以没有技术解决方案?我可以想出一些(例如,像bat脚本),但我想知道是否还有其他人有更好的想法和/或面临类似的限制并有解决方案。是的,我知道。但是请注意这样一个事实:在这种环境下进行任何更改都是一场与官僚地雷的政治斗争。增加JVM可用的堆内存没有其他选择。这是32位体系结构的寻址限制。这就是64位体系结构存在的原因。那么这就是一个政治问题——在您的案例中,没有一个可以通过技术来规避。接受由于局限性而导致的糟糕运行-只需向责任方指出问题并解释解决方案。然后这就成了他们的问题,每当有人来抱怨软件的性能时,他们就会指出(记录在案的)问题。如果这不能让你得到结果。。。“真的,换公司。”詹尼韦恩说,“所以你们的问题实际上是政治问题,而不是技术问题,所以我们不能帮助你们。您不能更改32位程序的模拟方式,如果可以,您也不想更改。@Durandal所以没有技术解决方案?我可以想出一些(例如,像bat脚本),但我想知道是否有其他人有更好的想法和/或面临类似的限制并有解决方案。此问题可能重复的答案与您的上一个问题相同。我觉得你遗漏了一些东西,但我不知道为什么。@PeterLawrey这不完全一样,但它是相关的。我本来打算在那个帖子上发帖,但我已经把那个帖子标记为已回复。这个线程处理的是“变通方法”,而前一个线程处理的是理解内存限制。我能想到的所有变通方法都涉及到安装64位版本的Java,它也是解决方案。如果我是一名系统管理员,我买了一台128GB的机器,我会坚持使用64位应用程序,否则会使机器变得毫无意义。如果你的
    int numThreads = Runtime.getRuntime.availableProcessors();
    if(numThreads < 1 || numThreads > 4) {
     numThreads = 4;
    }
    
    java -cp %CP% -Xms1024m -Xmx1536m net.analysis.MyProg %1