线程数和Java应用程序性能

线程数和Java应用程序性能,java,multithreading,performance,scala,Java,Multithreading,Performance,Scala,嗨:我有一个多线程Java应用程序。当前线程大小已为100。我们目前使用的是4核CPU。但正如人们在不久的将来看到的那样,CPU核心将增加一倍,甚至达到32个核心。为了充分利用内核,我们需要增加线程池的大小。但正如您可能知道的(也许我错了),当有100个线程时,Java是好的,但当有200、500、1000个线程时,可能会出现性能问题。那么我们应该使用其他编程语言,例如scala。我的担心合理吗 如果您有4个内核,那么最佳线程池大小可能是4,因为这是使所有CPU保持忙碌所需的最小线程数。但是,您

嗨:我有一个多线程Java应用程序。当前线程大小已为100。我们目前使用的是4核CPU。但正如人们在不久的将来看到的那样,CPU核心将增加一倍,甚至达到32个核心。为了充分利用内核,我们需要增加线程池的大小。但正如您可能知道的(也许我错了),当有100个线程时,Java是好的,但当有200、500、1000个线程时,可能会出现性能问题。那么我们应该使用其他编程语言,例如scala。我的担心合理吗

如果您有4个内核,那么最佳线程池大小可能是4,因为这是使所有CPU保持忙碌所需的最小线程数。但是,您可以拥有任意数量的空闲/等待线程,最多可达10K。这是JVM线程库的转折点,所以切换到Scala不会有任何区别。注意:你可以有更多的线程,我不推荐

如果你有10K线程,你想要更多,我建议你买另一台服务器。你们可以花1000美元左右买很多服务器

我在我的机器上运行了一个测试,在Ubuntu 11上使用Java 6 update 26、32位和64位创建了大量线程。前1000个线程的创建时间为72毫秒,从31K到32K,创建时间为3861毫秒。在大约32K个线程时,我得到了这个错误

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:640)

使用现代JVM,Java进程可以创建操作系统允许的任意多个线程。应用程序是否能够充分利用这些线程取决于应用程序的设计


如果需要考虑可伸缩性,我建议您首先关注应用程序的体系结构(数据结构、同步等)。不管编程语言如何,都需要考虑这些问题,Java本身并没有什么不适合多线程应用程序的地方。

我曾经用线程做过实验,以找出Linux和Windows之间是否存在显著差异,在这两个平台上都有大约2000个线程。这个测试已经有几年了,我没有重复,但后来我发现了其他人提到的相同号码,但我没有保存链接


在没有测试的情况下,我认为你对scala的看法是正确的。这里使用的技术——演员——可以处理更小的物体,好吧,但我不能给你数字。

@user84592:我不确定我的答案,只是头脑风暴。
在这台机器上安装虚拟机软件,将CPU核心分配给它们,这将使多台机器而不是一台物理机器,然后您可以将java应用程序工作负载切片到每台机器上……

由于Scala编译成与java相同的字节码,我认为您不会看到任何改进。您可能希望切换到非JVM语言,如Erlang。@TMN:最近的一个测试台将Akka(Scala)与Erlang进行了对比,以获得进程内性能@维克多·巴生:你看到这次事件的后续行动了吗?在对Scala和Erlang代码进行调优之后,Erlang的速度提高了6.2倍。我会回头看看你发表的文章,应该还有一篇后续文章,这篇文章应该会显示Scala的改进。有趣的东西@TMN:真有趣!:-)但是原始的基准测试Erlang与Scala Actors,而不是Akka Actors。在对线程数量如何影响性能做出任何假设之前,您确实需要衡量性能。您可能会感到惊讶,即,问为什么您认为首先需要更多线程。。。