【问题标题】:why OS processes seems faster than threads in java [closed]为什么操作系统进程似乎比java中的线程快[关闭]
【发布时间】:2013-06-12 16:43:37
【问题描述】:

我开发了一个多线程 java 应用程序,它使用线程来处理一批工作。我有一个主线程,它将作品分派到不同的线程。一切正常。

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

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

我注意到后一种方法的性能提升相当大,我想知道为什么。任何人都可以对此有所了解吗?操作系统进程调度是否比 java 线程更有效?当我真的需要提高性能时,是否应该将此作为一般经验法则?谢谢。

【问题讨论】:

  • 如果没有你的代码,这个问题几乎是不可能回答的(线程之间的同步和通信有开销),即使忽略线程与进程在调度优先级方面的关系也会因平台而异.
  • 您是否测试过仅使用一个 4 线程进程与两个进程相比的性能(吞吐量)?还是两个有 8 个线程或 2 个线程的进程?几核?正在进行什么样的处理以及如何处理?
  • 很可能你有一个资源瓶颈,你有两个进程已经加倍了。通常,您可以通过一个经过良好调整的进程来节省开销。

标签: java concurrency operating-system


【解决方案1】:

这真的取决于很多因素。首先,您是否查看了这两种情况下的 CPU 和内存负载水平?我希望在这两个进程的情况下,系统的负载更大,因此工作得更快。

另一个原因可能是您只有两个不同的内存堆,它们由两个单独的垃圾收集器清理。

进程如何相互通信(文件、管道、队列、套接字等)?在多个进程的情况下,您不能共享内存(除非您调用一些操作系统系统调用,这是有代价的)。您在测量时间时是否考虑到了这个通信时间?

【讨论】:

  • 听起来不错。具有相同设置的两个 JVM 等于两倍的内存。有更多的内存可用于进行处理。它可能会完全避免完整的 gc。很多时候使用更少的线程似乎会减慢速度而不是加快速度。垃圾收集可能不是加速因素,因为可能有两倍的内存用于收集。此外,每个流程都必须执行两次 JIT。
  • 这听起来很合理。该应用程序不是 CPU 密集型的,但确实需要大量内存。
猜你喜欢
  • 1970-01-01
  • 2011-05-24
  • 2020-02-20
  • 2013-11-22
  • 2011-01-22
  • 1970-01-01
  • 2021-07-10
  • 2011-10-31
  • 1970-01-01
相关资源
最近更新 更多