0

Java はマルチプロセッサ マシンで GC とヒープ割り当てをどのように処理しますか?

私が行った読書では、シングル プロセッサ システムとマルチ プロセッサ システムの間で使用されるアルゴリズムに違いはないようです。GC チューニングの芸術と科学は、Java がかなり成熟しているように見えますが、一般的な JVM 実装のいずれにもこれに関連するものは見つかりません。

データ ポイントとして、.Net では、アルゴリズムが大幅に変更されます。各プロセッサに関連付けられたヒープがあり、各プロセッサがそのヒープを担当します。これは、 MSDNなどの多くの場所で文書化されています。

スケーラブルなコレクション サーバー バージョンの実行エンジン (MSCorSvr.dll) を実行しているマルチプロセッサ システムでは、マネージ ヒープは複数のセクション (CPU ごとに 1 つ) に分割されます。コレクションが開始されると、コレクターは CPU ごとに 1 つのスレッドを持ちます。すべてのスレッドが独自のセクションを同時に収集します。ワークステーション バージョンの実行エンジン (MSCorWks.dll) は、この機能をサポートしていません。

特にマルチ プロセッサ システム向けの Java GC チューニングについて提供できる洞察は、私にとっても興味深いものです。

4

2 に答える 2

1

実際、Hotspot JVM では、ヒープの使用方法はヒープ サイズやコア数に依存しません。

各スレッド (プロセッサではない) には Thread Local Allocation Buffer (TLAB) があるため、オブジェクトの割り当ては安価でスレッドセーフです。このメモリ空間は、あなたが言及しているヒーププロセッサアフィニティと同じです。

Non-Uniform Memory Access (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 に答える