【问题标题】:How to determine max number of threads avialable in Java-VM?如何确定 Java-VM 中可用的最大线程数?
【发布时间】:2011-05-18 16:27:30
【问题描述】:

我想确定我可以为我的排序算法创建的最大线程数。我想为此使用 java.lang.Runtime

我想统计当前线程数量,达到限制时停止创建新线程。

【问题讨论】:

  • 你想使用java.lang.Runtime的哪些线索?

标签: java multithreading


【解决方案1】:

JVM 的最大线程数通常为数千。如果您使用多个线程来优化计算算法,那么您实际上并不需要超过运行系统中处理器的数量。使用Runtime.getRuntime().availableProcessors() 查找。

【讨论】:

  • 它只会告诉你系统中有多少个处理器,而不是还有多少可以工作。
  • 有没有不符合的情况?通过在只有数十个处理器的机器上运行数千个线程,您会在哪里获得更好的性能?
【解决方案2】:

我建议你从稍微不同的角度来看待这个问题......

我的意思是,如果你问

"what's the maximum number of threads I can create and use for task x?"

而您之所以这么问,是因为 您认为使用的线程越多越好,您可以改为问

"how many threads would I need to complete x most efficiently?"

非常不太可能,例如,任务 x 在双核机器上使用数千个线程时会更好地执行。例如,作为一般指南,对于 CPU 密集型任务(可能是排序算法),最佳线程数是

threads = number of CPUs + 1

How to find out the optimal amount of threads?

实际的最大线程数取决于操作系统和 JVM 以及配置为在 JVM 中使用的内存量。创建一个新线程需要一些操作系统内存,而不是 Java 的堆内存。这意味着如果您创建数千个线程,您可能会用完内存,而使用 -Xmx 则无法增加。事实上,您分配的 Java 堆内存越少,可用的本机内存就越多,因此您可以创建的线程就越多。

请参阅this article 和评论,了解如何用笔和纸计算出最大值。

话虽如此,如果您想在应用程序中使用无限数量的线程,您可以使用 `Executors.newCachedThreadPool()' 来创建线程池,创建所需数量的线程。我不建议将这种类型的池用于日常使用,但这与您最初的问题有关。

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    您可以通过将visualvm 附加到您的进程来查看您有多少线程。我推荐下载所有插件的 1.3.2 版本。

    我还建议使用 Spring 及其 Executor 池。这是能够配置线程池大小的好方法。

    【讨论】:

      猜你喜欢
      • 2014-06-26
      • 2010-09-15
      • 2023-03-07
      • 2010-11-20
      • 2017-12-25
      • 2016-02-16
      • 2017-01-06
      • 1970-01-01
      相关资源
      最近更新 更多