【问题标题】:Java and multiple coresJava 和多核
【发布时间】:2014-08-30 15:25:39
【问题描述】:

我有时在某处读到我们应该每个内核有一个 JVM。我还读到 Java 不适合多核或 CPU,因此首选 scala。

最近on a link 我读到如果可用的话,多个线程确实在不同的内核中执行。

问题:

  1. JVM 是否考虑多个内核/CPU 并在可用的情况下在单独的内核中执行每个线程?
  2. 使用 scala 来更好地使用内核与仅在单独的内核中执行有些不同?
  3. 如果 JVM 在单独的内核(如果可用)中执行每个线程,那么每个内核一个 JVM 的含义是什么,只有一个 JVM,我可以利用所有内核。
  4. 如果对 1 的回答是肯定的,那么在同一台机器上运行的多个服务器实例中部署 war/ear 有什么用。

【问题讨论】:

  • 我不太明白.. JVM 转发对本机OS的所有调用。多核/单核直接对它有什么影响?
  • @TheLostMind - 这很重要。在 Python 中,GIL 防止同时使用多个内核,即使它可以在给定时间在任何单个内核上执行,所以这个问题是相关的。
  • 您能否提供(并注明日期)“每个核心一个 JVM”的断言?自 JDK 1.5 以来,我一直在没有任何特殊干预的情况下在多个内核上执行多个线程......(在那之前多核机器并不那么普遍)

标签: java multithreading jvm


【解决方案1】:
  1. 是的。实际上,现在所有的 JVM 都使用本地线程。所以跨内核的线程调度和分发是由操作系统完成的,而不是由JVM完成的。

  2. Scala 与 Java 一样在 JVM 上执行。所以 Java 和 Scala 之间线程使用内核的方式没有区别

  3. 没有理由让每个内核有一个 JVM。您可能希望这样可以避免每个 JVM 使用两个大量内存,或者能够在不中断任何服务的情况下从版本 1 转到版本 2,但这是另一回事。

  4. 没有与多线程问题相关的原因。正如我所说,您可能希望拥有两个 JVM,以便能够在不中断任何服务的情况下关闭一个,或者例如为不同的客户隔离同一应用程序的两个版本。但这与多线程无关。

【讨论】:

  • 你的意思是说JVM可以直接决定如何执行线程
  • 不,恰恰相反。线程调度由操作系统完成。
  • 那么-多核/单核对它有什么直接影响?
  • 我不确定你的意思。但这很重要,因为某些竞争条件和可见性问题只有在使用多个内核时才会发生。因此,Java 内存模型必须考虑到多个内核(确实如此)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 2015-04-18
  • 2016-04-13
相关资源
最近更新 更多