为什么在Java中,操作系统进程似乎比线程更快

4

我开发了一个多线程Java应用程序,使用线程处理一批工作。我有一个主线程将工作分配给不同的线程处理。一切正常。

现在我已经改变了应用程序,使它能够在多个Java进程中运行,每个进程都像以前一样进行多线程处理。例如,我以前使用8个线程在一个Java进程中处理8个作业,现在我可以有2个Java进程,每个进程有4个线程,仍然处理8个作业总共。

该应用程序的模型如下:调度程序将获取需要完成的工作,然后将它们分配到线程池。线程之间没有同步或通信。

我注意到后一种方法有相当大的性能提升,想知道原因。有人能否对此提供一些见解?操作系统进程调度比Java线程更加有效吗?当我真正需要这种性能提升时,我是否应该将其用作一般准则?谢谢。


这个问题几乎不可能回答,如果没有您的代码(线程之间的同步和通信会带来开销),即使忽略线程在调度优先级方面与进程的关系,也会因平台而异。 - Brian Roach
你测试过只有一个4线程进程与两个进程相比的性能(吞吐量)吗?或者是两个拥有8个线程或2个线程的进程?有多少个核心?正在进行什么样的处理以及如何处理? - Panu
1
很可能您有一个资源瓶颈,而且由于有两个进程,这个问题变得更加严重。通常情况下,当进程调优良好时,只有一个进程可以节省开销。 - Peter Lawrey
1个回答

2
这真的取决于许多因素。首先,您是否在两种情况下查看了 CPU 和内存负载水平?我预计在两个进程的情况下,系统负载更大,因此工作速度更快。
另一个原因可能是您只是拥有两个不同的内存堆,它们由两个分别清理的垃圾收集器清理。
还有,这些进程如何相互通信(文件、管道、队列、套接字等)?在多个进程的情况下,您无法共享内存(除非调用一些操作系统系统调用,这会带来成本)。在测量时间时,您是否考虑了这种通信时间?

听起来不错。两个具有相同设置的JVM等于两倍的内存。有更多的内存可用于进行处理。这可能会完全避免full gc。很多时候,使用较少的线程似乎会减慢速度而不是加快速度。垃圾收集可能不是加速因素,因为进行收集的内存可能是原来的两倍。此外,每个进程都必须执行两次JIT编译。 - Panu
这听起来很合理。该应用程序不需要大量的CPU资源,但确实需要大量的内存。 - Wudong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接