0

Java如何處理多處理器機器上的GC和堆分配?多處理器機器上的Java堆和GC?

在我所做的閱讀中,在單處理器和多處理器系統之間使用的算法似乎沒有任何區別。 GC調優的科學技術看起來相當成熟,但在任何常見的JVM實現中我都找不到與此相關的任何內容。

作爲一個數據點,在.Net中,算法顯着變化:每個處理器都有一個堆,每個處理器負責堆。這在許多地方,如MSDN記載:

可擴展集合在多處理器系統上運行的服務器 版本的執行引擎(MSCorSvr.dll)中,託管堆是 分裂成幾個部分,一個每個CPU。當啓動一個集合 時,收集器每個CPU有一個線程;所有線程同時收集他們自己的部分 。 執行引擎(MSCorWks.dll)的工作站版本不支持此功能。

任何可以提供給特定於多處理器系統的Java GC調優的洞察力也是我感興趣的。

回答

0

垃圾收集是一個實現特定的概念。不同的JVM(IBM,Oracle,OpenJDK等)有不同的實現,不同的版本也有不同的機制。通常,您可以選擇啓動Java程序時要使用的機制。

Similar questions here....

這些細節往往是在文檔中給出你的JRE的命令行選項:

IBM JDK Here

Oracle JRE Options here

+0

我看過各種JVM,沒有看到有關多進程系統中GC算法變化的細節。我期待着找到具有這種特徵的昂貴的商業實現,但是我發現......沒有。 –

+0

其中一個原因可能是因爲,考慮它,*所有*我能想到的GC策略都是爲MP量身定做的......試圖找到適用於SingleProcessor的設計將會更具挑戰性(如果您忽略dalvik )。 – rolfl

+0

...但他們都沒有做分裂和親和堆到每個可用的處理器。我很驚訝我無法在Java堆管理中找到任何特定的多處理器。 –

1

事實上,在熱點JVM的方式堆被使用並不取決於堆的大小或內核的數量。

每個線程(不是處理器)都有一個線程本地分配緩衝區(TLAB),因此對象分配很便宜且線程安全。這個內存空間與您提到的堆處理器親和性是相同的。

您還可以激活非均勻內存訪問(NUMA)。 NUMA背後的想法是選擇靠近CPU芯片的RAM來存儲對象,而不是將整個堆作爲統一空間。

最後,GC是多線程的,可以擴展您的內核數量,因此它們充分利用了您的硬件。