嗨:我有一个多线程Java应用程序。当前的线程大小已经是100.我们目前正在使用4核CPU。但正如人们在不久的将来看到的那样,CPU内核将增加一倍,甚至达到32个内核。为了充分利用核心,我们需要增加线程池大小。但是你可能知道(也许我错了),当有100个线程时Java很好,但是当线程是200,500,1000个线程时可能存在性能问题。然后我们应该使用其他编程语言,例如scala。我的担心合理吗?
答案 0 :(得分:10)
使用现代JVM,Java进程可以创建与操作系统允许的一样多的线程。您的应用程序是否能够充分利用这些线程取决于您的应用程序的设计。
如果可扩展性是一个问题,我建议您首先关注应用程序的体系结构(数据结构,同步等)。无论编程语言如何,都需要考虑这些问题,并且Java没有任何内容使其本身不适合大量多线程应用程序。
答案 1 :(得分:1)
如果您有4个内核,则最佳线程池大小可能为4,因为这是保持所有CPU忙碌所需的最小线程数。但是,您可以拥有任意数量的空闲/等待线程,最高可达10K。这是一个JVM线程库引爆点,因此切换到Scala不会有任何区别。注意:你可以有更多的线程,我不推荐它。
如果您有10K线程并且您想要更多,我建议您购买另一台服务器。您可以为服务器购买大约1000美元。
我在Ubuntu 11上使用Java 6更新26,32位和64位在我的机器上创建了大量线程的测试。前1000个线程需要72毫秒才能创建,从31K到32K,需要3,861 ms来创建。大约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)
答案 2 :(得分:1)
我曾经使用线程进行实验,以了解Linux和Windows之间是否存在显着差异,并在两个平台上的大约2000个线程上遇到了一些障碍。测试已有几年了,我没有重复,但后来我找到了其他人提到的相同数字,但我没有保存链接。
没有测试,我认为你对scala是对的。那里使用的技术 - 演员 - 使用较小的物体,afaik,但我不能给你数字。
答案 3 :(得分:0)
@ user84592:不确定我的答案,只是头脑风暴。 如何在这台机器上安装虚拟机软件,向它们分配CPU内核,它将生成许多机器而不是一台物理机器,然后你可以将java应用程序工作负载切成每个...