4

このリンクでは、次のように述べられています。

これらの一時停止は、ヒープを圧縮してスペースを解放するという必然的な要件の結果です。コレクターはさまざまな戦略を使用してこれらのイベントを遅らせますが、商用利用可能なすべてのコレクターで圧縮は避けられません。

アプリケーションのメモリ フットプリントを一定に保つ場合、GC コンパクションが発生する必要はないという印象を受けました。つまり、オブジェクトの追加と収集を続ける場合にのみ発生します。十分な空き領域がある十分な大きさのヒープがある場合、穴を作成していない (つまりゴミを生成していない) のに、なぜ圧縮する必要があるのでしょうか?

Java アプリケーションのメモリ フットプリントを一定に保つのは簡単ではないことは理解していますが、適切なプロファイリング ツール、ブートストラップ、規律があれば可能です。

では、一定のメモリ フットプリントがあれば、Java アプリケーションは GC によるレイテンシなしで、つまり GC の一時停止なしで実行できると仮定するのは合理的ではないでしょうか?

EDIT:一定のメモリフットプリントとは、steady stateAjay Georgeが述べたように、オブジェクトが作成または逆参照されない場合を意味します。オブジェクトを作成し続けると、最終的にメモリ不足になり、オブジェクトを逆参照し続けると、最終的に GC がトリガーされます。したがって、最終的な目標は、起動、ウォームアップ、完全な GC の実行を強制してから、運用時間の安定状態に入るということです。

4

3 に答える 3

2

アプリケーションのメモリ フットプリントを一定に保つ場合、GC コンパクションが発生する必要はないという印象を受けました。つまり、オブジェクトの追加と収集を続ける場合にのみ発生します。

オブジェクトが逆参照される (ガベージ コレクションの対象となる) 瞬間に、圧縮が発生する余地があります。これは、ハード ドライブが断片化するのと同じように、ヒープの断片化を開始するためです。

では、一定のメモリ フットプリントがあれば、Java アプリケーションは GC によるレイテンシなしで、つまり GC による一時停止なしで実行できると仮定するのは合理的ではないでしょうか?

GC によって導入されるレイテンシは、使用される GC アルゴリズムのタイプの結果です。これは、一定のメモリ フットプリントを持つという概念と直交しています。アプリがオブジェクトを作成または逆参照せず、一種のオブジェクトを取得した場合を検討している場合は、そうsteady stateかもしれません。ほとんどのオブジェクトは存続期間が短いため、理想的には、これは当てはまりません。

そうは言っても、Azul の Pauseless Collection アルゴリズムを使用すれば、これは可能かもしれません。それについての優れた議論がここにあります。

于 2012-11-21T05:46:57.593 に答える
1

いいえ、圧縮は実際には必要ありません。多くのガベージ コレクターは圧縮しません。その好例が CPython で、オブジェクトがメモリ内で移動することはありません。

ガベージ コレクタの圧縮には、断片化されたメモリを取り戻すという 1 つの大きな利点があります。

4K ページにまだ 16 バイトの None が含まれていると解放できないため、圧縮しない場合でも、プロセスのメモリ使用量が減ることはありません。ガベージ コレクション システムでは、定常状態は大量のガベージが生成され、リサイクルされることを意味するため、ここでは定常状態は役に立ちません。定常状態はその等量です。CPython は、オブジェクト生成を通じてそれを処理します (新しく作成されたオブジェクトはガベージになる可能性がはるかに高くなります)。

最後に、インクリメンタル ガベージ コレクタがあります。または、最先端の研究を行った場合は、一時停止のない同時ハードウェア アシスト ガベージ コレクタhttp://www.cs.purdue.edu/homes/hosking/ismm2000/papers/heil.pdf、市販のhttp ://www.azulsystems.com/products/zing/whatisit

于 2013-01-22T16:37:16.833 に答える
0

「圧縮は避けられない」と彼らが言うとき、彼らが意味することは単に、典型的なメモリ割り当てパターンに対して、適切なGCが最終的に圧縮を実行することを意味していると私は信じています。

Javaについては特に知りませんが(おそらく使用するJVMに依存します)、ほとんどの言語は、メモリの割り当てまたは割り当て解除を行わない限り、GCをまったく呼び出しません。非常に多くの場合、それは割り当て中 (より多くの空きメモリが必要になるのはそのときだけ) だけであり、もちろん明示的に呼び出されたときでもあります。

したがって、割り当てが発生せず、ガベージも生成されない「安定状態」のかなり奇妙な定義では、完全なコレクション/圧縮が既に行われている場合、GC を呼び出す理由はまったくありません。その場合、ヒープを圧縮しようとするのはもちろん時間の無駄です。

于 2014-01-03T07:31:44.390 に答える