0

Java 如何处理多处理器机器上的 GC 和堆分配?

在我所做的阅读中,单处理器系统和多处理器系统之间使用的算法似乎没有任何区别。GC 调优的艺术和科学是 Java 似乎相当成熟,但我在任何常见的 JVM 实现中都找不到与此相关的任何内容。

作为一个数据点,在 .Net 中,算法发生了显着变化:每个处理器都有一个关联的堆,每个处理器负责该堆。这在许多地方都有记录,例如MSDN

可扩展集合 在运行服务器版本的执行引擎 (MSCorSvr.dll) 的多处理器系统上,托管堆被分成几个部分,每个 CPU 一个部分。发起收集时,收集器每个 CPU 有一个线程;所有线程同时收集自己的部分。执行引擎 (MSCorWks.dll) 的工作站版本不支持此功能。

我对专门针对多处理器系统的 Java GC 调优提供的任何见解也很感兴趣。

4

2 回答 2

1

实际上,在 Hotspot JVM 中,堆的使用方式并不取决于堆大小或内核数。

每个线程(不是处理器)都有一个线程本地分配缓冲区(TLAB),因此对象分配便宜且线程安全。该内存空间与您提到的堆处理器关联性有点相同。

您还可以激活非统一内存访问 (NUMA)。NUMA 背后的想法是更喜欢靠近 CPU 芯片的 RAM 来存储对象,而不是将整个堆视为统一空间。

最后,GC 是多线程的,并且可以根据您的内核数量进行扩展,因此它们可以利用您的硬件。

于 2013-05-17T09:22:33.967 回答
0

垃圾收集是一个特定于实现的概念。不同的 JVM(IBM、Oracle、OpenJDK 等)有不同的实现,不同的版本也有不同的机制。通常,您可以在启动 Java 程序时选择要使用的机制。

类似的问题在这里......

这些详细信息通常在 JRE 命令行选项的文档中给出:

IBM JDK 在这里

此处的 Oracle JRE 选项

于 2013-05-15T17:12:46.307 回答