GC
Garbage Collection
ヒープ領域上のゴミを自動で回収し、再度利用できるようにする
データ領域やスタック領域から辿る
GCがないとどうなるか
手動でメモリを管理しないといけない
問題
メモリリーク
ダングリングポインタの参照
脆弱性ex: IE6/7 ゼロディ脆弱性
使用中のメモリ領域を誤って解放
メモリ系のバグはバグを特定しにくい
考案
John McCarthy
1960年
Mark Sweep GCを発表
GCどうしの比較要素
安全性
スループット
完全性と即時性
停止時間
空間的オーバーヘッド
特定の言語への最適化
スケーラビリティとポータビリティ
種類
基本的なもの
Mark Sweep GC
参照カウントGC
Copying GC
Mark Compact GC
応用
Generational GC(世代別GC)
Incremental GC
GCの大きな2種類
保守的GC
正確なGC
Pauseless GC
RealTime GC
Concurrent GC
Concurrent Mark Sweep GC
ref
Snapshot GC
Bitmap GC
モダンなGC
★参考
Epslion GC
JVMのGC
G1
CMS GC
ZGC
Shenandoah GC
「Rubyのしくみ」でサラッと触れられてた「JVMで使用できる新しい実験的なGC」
ガベージファースト
継続的同時圧縮
実装編
PythonのGC
DralvikのGC
RubiniusのGC
V8のGC
用語
粒
割り付けの最小単位
セル
小さな連続した粒のグループ全般
オブジェクト
メモリ領域上に配置される基本単位
ヘッダとフィールドによって構成される
ヘッダ
オブジェクト自体の情報(サイズ、種類など)を保持する
利用者は直接変更できない
フィールド
利用者が参照したり、書き換えたりできる部分
フィールドに置かれるデータはポインタか非ポインタの2種類
ポインタ
オブジェクトへのポインタは必ず先頭を指す
非ポインタ
値そのもの
ブロック
特定のサイズのアドレスを境界に整列したチャンク
サイズは通常2のべき乗
カード
2^k境界に整列したチャンクで、ページより小さく、スペース間のポインタを記録する手法に関連するもの
ミューテータ
アプリケーション(GC対象となるオブジェクト間の参照関係)を変化させる
GCはミューテータの裏側で動いている
ミューテータが行うこと
オブジェクトの生成
ポインタの更新
評価項目
スループット
単位時間あたりの処理能力
最大停止時間
GCを行っている間はミューテータの実行は停止する(しないものもある)
Stop The World
この「停止している時間」の最大値のこと
1回のGCで最もかかる時間
スループットと最大停止時間はトレード・オフの関係になることが多い
つまり、短いGCを多くの回数実行するか、回数を減らす代わりに一回の時間を増やすか
ヒープ領域の使用効率
ヘッダに多くの情報を詰めるとGCの効率は向上するが、ヘッダのサイズは小さい方が好ましい
参照の局所性
ワークリスト
ここに入る可能性のあるものは以下を満たす
ルートから辿れる
まだマークされていない
子を持っている
言語別リンク(あとで上とくっつけてまとめる
https://en.wikipedia.org/wiki/Garbage_collection_(computer_science) ←ここにいっぱい書いてる
GoのGC
v1.10: concurrent Mark Sweep
v1.5: tri-color GC
https://speakerdeck.com/taxio/go-gc-algorithm-101
Nim
cycle collector https://qiita.com/snowlt23/items/f50ab84afeab9469e422#gcについて
https://nim-lang.org/docs/gc.html
https://nim-lang.org/features.html ←途中くらいにGCについて言及
↑多分こんなふうに言語ごとのドキュメントに書いてると思うので読もう
C, C++
Boehm GC
Rust
PythonのGC
RubyのGC
Java (JVM)
ref
minor GCがCopying GC
major GCがmark sweep
3つの独立したGCをコマンド引数で選択できる
シリアル
並行GCを使用しない。GC実行時はミューテータは停止する
並列
別スレッドでGCを実行
並行
並行で実行。停止時間をへらすように最適化しているが、ミューテータの全体的なスループットは低下するかもしれない
JavaScript
Mark Sweep
PHP
参照カウント
OCaml
コピーGC
Haskell
https://qiita.com/autotaker1984/items/258ed186383a1e5c58d6
Copy GC
C#
Mark & Sweep
3世代の世代別GC
https://ufcpp.net/study/csharp/rm_gc.html
Lisp
マークスイープ
関連
RubyでGCを書く
https://www.slideshare.net/authorNari/rubygc-14302032
参考
GCが止まらない 未読
GC黄金時代未読
keen氏のブログになんかあったような
https://keens.github.io/blog/2018/09/09/thoughts_on_gcs/
https://keens.github.io/slide/gcto1bit/
https://keens.github.io/blog/2017/12/07/webassemblynogc/
https://keens.github.io/blog/2014/10/26/gcfalsehua/
https://keens.github.io/slide/picrin-gc/
https://ufcpp.net/study/computer/MemoryManagement.html
「『Rubyのしくみ』」の最後の方に掲載されていた参考文献
John McCarthyの本のフリーリスト実装について
recursive functions of symbolic expressions and their computation
Rubiniusで使用されたImmixアルゴリズムについて
Immix: A Mark-Region Garbage Collector with Space Efficiency, Fast Collection, and Mutator Performance
JVMの全体的なGCアルゴリズムの説明とコマンド引数についてのドキュメント
Java SE 6 HotSpot Virtual Machine Garbage Collection Tuning
一般的なGCアルゴリズムとそれの歴史
Garbage Collection: Algorithms for Automatic Dynamic Memory Management
The Garbage Collection Handbook
書籍
『ガベージコレクションのアルゴリズムと実装』
ガベージコレクション本
『コンパイラとバーチャルマシン』
徹底解剖「G1GC」アルゴリズム編
徹底解剖「G1GC」実装編
まとまっているページ
レアでアレなGCの話
ガベージコレクションの実装法と評価
GCアルゴリズム詳細解説
第5章 ガ-ベージコレクション