2017-12-10 11 views
1

"The Garbage Collection HandBook"という本を読むと、第9章 は次のようになります。 "オブジェクトの寿命は、その生年月日とその間に割り当てられたヒープスペースのバイト数死。"。私はこの文をよく理解していません。なぜ生涯は割り当てられたバイトによって測定できますか?私はそれをGoogleにしようとするが、私は答えを得る。 誰がそれを私に説明できますか?ありがとう!ヒープの測定時間にオブジェクトを割り当てる方法

答えて

1

インスタンス化と死亡の間に割り当てられたバイト数でオブジェクトの寿命を測定することで、GCアルゴリズムがプログラムの動作に適応しやすくなります。

オブジェクト割り当ての速度が非常に遅い場合、単純な時間測定ではコレクション間に長い休止時間が表示され、これは良いと思われます。しかし、オブジェクトの存続期間のバイト割り当ての測定値が高い場合、オブジェクトは生存スペースまたは古い世代に速やかに昇格される可能性があります。バイトの割り当てを測定することにより、マイナーコレクションが発生する前に若い世代を拡大してゴミになるオブジェクトの数を増やすことで、コレクターはヒープサイズをより効率的に最適化できます。この尺度として時間を使うだけで、ヒープのサイズを自明に変更する必要はありません。

マルチスレッドアプリケーションでは、個々のスレッドのバイト割り当てを測定するのが難しいため、コレクタはオブジェクトが残っているコレクションの数でライフタイムを測定する傾向があります。これは、監視するための簡単な番号であり、記録に必要なスペースがより少なくて済みます。

1

「時間」は、イベントを注文するための尺度に過ぎません。現実世界でさえ、多くの可能なユニットがあります。コンピュータ内部では、ガベージコレクションの目的のために、実世界の時間単位は必要なく、ガベージコレクタが通常知りたいすべてのオブジェクトが、他のオブジェクトよりも古いものです。

この目的のために、各割り当てられたオブジェクトに昇順の数字を割り当てるだけで十分ですが、これは追加のカウンタを維持することを意味します。これとは対照的に、割り当てられたバイト数は空きになります。割り振られたバイトだけを累積し、割り振られていないバイトを減算することは絶対にありません。

世代別メモリ管理では、オブジェクトが専用スペースに連続して割り当てられるため、このアドレスの相対的な経過時間がこのメモリ領域内で表されるため、この番号は各割り当てで更新する必要はありません。最後のガベージコレクションに関連付けられています。ガベージコレクタが実行中のオブジェクトを実行して移動するときだけ、必要に応じてこの情報を絶対時代にマージする必要があります。

HotSpot JVMのような実装はこれをさらに単純化します。生き残ったオブジェクトのために、それは生き残ったガベージコレクションサイクルの数を保持する小さなカウンタを維持する。設定可能な数の収集サイクルから生き延びた後、それは古い世代に昇格し、そのポイントを超えて、オブジェクトの年齢は無関係になります。

+0

あなたはこう言っています。「対照的に、割り当てられたバイト数は無料です。次に、各オブジェクトの誕生と死亡の間に割り振られたバイト数を数える方法は?すべてのオブジェクトにカウンタを追加する必要がありますか?私は少しパズルです。 – Huzhenyu

+0

最も若いオブジェクトが同じスペースにある限り、最後のオブジェクトの終わりは割り当てられたバイト数に等しい。前述のように、相対的な年齢は、別のメモリ空間を通して絶対的な年齢を追跡しようとする場合、次のガベージコレクションサイクル*でそのメモリ空間のベース年齢(最後のgcの時間)とマージする必要があります。これは、その情報を保持するストレージを必要とするかもしれませんが、通常、JVMはオブジェクトの死までの年齢を追跡しません。 JVMはオブジェクトの死を全く検出しません。彼らは生存者だけを気にします。 – Holger

関連する問題