java线程数>核心数和垃圾收集量

时间:2016-04-26 16:10:45

标签: java multithreading garbage-collection

我们正在使用java 7并致力于多线程数据处理应用程序。由于某些约束,我们不使用spark或任何其他map-reduce方法来解决此问题。该项目的想法是使用多线程最大化应用程序的性能。

我的理解是,在任何给定的点上,考虑到CPU除了OS之外没有运行任何其他东西,同时工作的线程数将等于CPU提供的超线程数。但是有一个java GC会不时地启动。我们也必须考虑这一点。

另外,我知道如果我创建更多线程,那么由于在上下文切换中花费的时间,我实际上会降低性能。

问题是考虑所有这些事情并创建适当数量的线程的最佳方法。任何想法或思考过程?我还应该考虑其他任何流程吗?

2 个答案:

答案 0 :(得分:3)

  

问题是考虑所有这些事情并创建适当数量的线程的最佳方法

我会使用Java 8为你做这件事。 e.g。

Results result = listOfWork.parallelStream()
                           .map(t -> t.doWork())
                           .collect(Collectors.reduce(.....));

但是,如果您坚持使用Java 7,则可以使用ExecutorService。

int procs = Runtime.getRuntime().availableProcessors();
ExecutorService es = Executors.newFixedThreadPool(procs);
  

但是有一个java GC会不时地启动

除非您使用CMS,否则它不会同时启动,因此这些线程正在做什么并不重要(在调整线程池方面)

  

我还应该考虑其他任何过程吗?

如果在使用CPU的机器上有其他进程,你应该考虑它们。

答案 1 :(得分:0)

我实际上在上学期做过研究。使用线程时,为CPU绑定进程提高性能的一个好的经验法则是使用相同数量的线程作为内核,除非是超线程系统,在这种情况下,应该使用两倍的内核。可以得出的另一个经验法则是I / O绑定过程。这个规则是每个核心的线程数量翻两番,除了超线程系统的情况,每个核心的线程数量可以翻两番。