世代GCとCardTable

世代別ガベージコレクション

ガベージコレクションを持つすべての近代的な言語は次のような理由に基づいている世代別ガベージコレクション機構を採用しています:

  1. ほとんどすべてのオブジェクトのライフサイクルのが非常に短い生存期間は、いくつかのガベージコレクションサイクル以上ではありません
  2. GC時間は、通常のオブジェクトの90%以上が、最後のGC以降に作成されています
  3. オブジェクトは、より多くのガベージコレクションサイクルを生き延びている場合は、GCは再びこのテーマにマークされます

割り当てられたバイト

世代別ガベージコレクションアルゴリズム

様々に異なる世代に分けることができる実行されてオブジェクトプログラムを生成し、それは、通常、生存期間のオブジェクトに応じて決定されます。

下の高世代のメモリブロックの再利用のコメントが、システムは長い休止を引き起こす可能性があり、通常、低世代のメモリブロックは、短い休止システムを引き起こして、より頻繁にリサイクルされます。

低Gen0世代とのGen1の高い世代:私たちは、プログラムメモリを2つに分割されていることを前提としています。新しいオブジェクトはスペースGen0の使用に割り当てられています。

GEN-1

4つのメモリ・オブジェクトの合計は、我々は、解放されたメモリを参照するであろう

GEN-2

今回は、GCをトリガした場合、プログラムは2つのオブジェクトが到達不能そこGen0をしていることがわかりますので、それらをきれいにします。

GEN-3

GCのいくつかのラウンド後、両方のオブジェクトが状態でまだ生きていると、プログラムはそのGen1の、その古い時代に昇格されます

GEN-4

さて、次のように保存され、次回のGCメモリのオブジェクトを起動すると、プログラムで出て多くのオブジェクトの分布が実行されていることを前提としています。

GEN-5

ときに我々だけGC Gen0(新世代)、およびGen1のをスキャンせずに、ルートオブジェクトから見上げ始めるには、唯一見つけるために、いくつかのマーク✓がです。彼らは直接到達可能なルートであるため、それが間接的であるため、スキャンできませんので、赤い矢印は対象を指しています。

(歳)Gen1の中のオブジェクトの数が含まれているため、全メモリ空間のスキャン時間は、非常に膨大なコストになる場合は、オブジェクトGen0の数よりもはるかに大きくなります。

したがって、世代収集アルゴリズムの全ては、全体走査Gen1の領域Gen1のガベージコレクションGen0記憶領域Gen0オブジェクト参照レコードを、オブジェクト、これらのオブジェクトも回避する、処理されたルートとして働く含有するように使用されるであろう。それは時間アルゴリズムの典型的なスペースです。具体的な実装は以下の通り:

GEN-6

カードの表

通常来说,老年代的空间大小往往比新生代要大得多,里面对象的数量也非常多。如果我们以引用的方式来保存对象,这个数据结构所占用的空间可能非常大。为了加快一点GC的速度,使得程序整体内存占用上升了30%-40%,这样的开销是否值就有待商榷了。因此,记录老年代空间大小的数据结构有以下两个特点:

  1. 占用的内存空间必须非常小
  2. 老年代中持有新生代对象的数量通常较少,是一种比较稀疏的映射结构

基于以上两点,几乎所有的分代算法都采用了Card Table的方式保存持有新生代引用的老年代对象信息。

保存对象二元状态且最省空间的数据结构必然是bitmap,Card Table也是bitmap的一个变种。它采用一个bit位代表老年代内存中的一片空间,如果这片空间中包含持有新生代引用的对象,就将这片空间至1(标记为dirty)。这样,我们就得到了一个不那么精确的结果:我们知道了哪些空间中包含了持有新生代对象引用的老年代对象。在进行垃圾回收时,只需要将这些对象遍历一次,就能够精确的知道哪些对象是我们所需的。

cardtable

如上图所示,Card Table中一个bit代表实际内存中4KB的空间。从原理可知:CardTable中bit所映射的空间越小,所包含的信息也就越模糊;映射的空间越大,所占用的内存空间也就越多。JVM中Card Table一个bit对应的内存空间为512byte。

Write Barrier

从CardTable原理可知,每当引用关系被创建或改变时,都有可能需要对Card Table进行修改。因此,在含有GC的高级语言中,通常会在赋值语句(即含有=)的前后进行一些逻辑操作。这种类似AOP的机制就被成为Write Barrier。例如:

a.val = b;

当JVM执行上述语句时,实际上在虚拟机中执行的语句为:

void oop_field_store(oop* field, oop value) { 
  pre_write_barrier(field); 
  *field = value; // the actual store 
  post_write_barrier(field, value); 
}

代码中的pre_write_barrier()与post_write_barrier()都是write barrier,JVM会在这个方法中对引用或对象做一些额外的操作。其他高级语言类似C#、js等都有此类机制。

总结

世代別ガベージコレクション機構は、カードの表を使用して様々な高レベルの言語を横断し、バリアを書くために、プログラム全体を実行した後世代のメモリ空間を避けるために、傾向の最適化を行うためのGCアルゴリズムの実際の使用に基づいて、コンピュータ科学者であります新世代の道ガベージコレクションの効率を最適化する時のためのスペースは、最終的には非常に効率的なガベージコレクションアルゴリズムを取得します。

オリジナル:ビッグボックス  世代GCとCardTable


おすすめ

転載: www.cnblogs.com/wangziqiang123/p/11618365.html