ある質問のある回答で、JavaやC#が参照カウントを使用していると言うのがありました。しかし、私の記憶では、JavaやC#は参照カウントは使用していなかったと思います。色々調べましたが、公式または(個人ブログとかじゃない)信頼できる準公式な情報がうまく見つからず、わからない状態です。
そこで、参照カウントの有無やGCの種類をまとめたいと思っています。それぞれの言語について情報(公式なドキュメント、信頼できる企業・団体のサイト、多数の技術者によってメンテナンスされているWikiなど)を知っている方は教えていただけませんか? 公式のみだと情報が少なくなりそうなので、この際、個人ブログ等でもかまいません(ただし、参考資料扱いにさせていただきます)。
【言語/実装別GC一覧】
言語 | 参照カウント | GC |
---|---|---|
C | × | × |
C++(スマートポインタ) | ○ | × |
D | 不明 | 世代別GC |
Go(gc) | 不明 | よくわからない、解説求む |
Go(gccgo) | 不明 | 未実装? |
Rust | ○ | × |
Swift | ○ | × |
Haskell(GHC) | 不明 | 世代別GC? |
Java(Oracle) | 不明 | 世代別GC+コンカレントGC+G1 |
Java(OpenJDK) | 不明 | 不明 |
C#(.NET Framework) | × | 世代別GC |
C#(Mono) | 不明 | 不明 |
Erlang | 不明 | インクリメンタルGC? |
Perl5 | ○ | × |
Perl6(MoarVM) | 不明 | 世代別GC |
Python(CPython) | ○ | 世代別GC |
PHP | ○ | M&S |
Ruby(MRI) | × | 世代別GC+インクリメンタルGC |
JavaScript(V8) | ○? | M&S? |
JavaScript(SpiderMonkey) | ○? | M&S? |
JavaScript(JavaScriptCore) | ○? | M&S? |
JScript(Chakra) | ○? | M&S? |
※ __斜体__はよくわかっていない部分です。
※ 循環参照も確実に回収できる方式をGCとしています。よって、スマートポインタはGCではありません。
※ 各言語は最新バージョンが対象です。なお、Python2とPython3は同じのようです。PHPにGCが追加されたのは5.3からです。RubyはRubyはM&S→世代別GC→インクリメンタルGCと進化して行っています。
※ 実装は明記されていない限り各言語の公式なものとします。
※ JavaはJava仮想マシン、C#は.NET Framework/Mono依存の可能性があります。ScalaやKotlin、F#やVB.NETについても情報があれば教えて下さい。
※ MozillaにJavaScriptにおけるメモリ管理のドキュメントがありますが、概要だけではっきりしません。
※ その他、この言語はこれを使っているという情報があれば教えて下さい。
※ Java8にはインクリメンタルGCもあるようですが、非推奨になっています。
※ Rustの参照カウントは標準ライブラリとして提供されます。
※ MoarVMはPerl6のVM。RakudoもMoarVMを使っているはず。
間違い等があれば、ご指摘下さい。「無い」ことを証明するのは悪魔の証明になり得るため、しばらくして指摘が無ければ、不明部分は「×」にしていきたいと思います。世代数も調べていった方が良いかちょっと悩んでいます(世代別GCでは無い場合は1世代しかないという扱いをするとか)。
【用語集】
- 参照カウント: オブジェクトへの参照数をカウントしていき、0になれば即座に削除される方式。実装が単純で高速だが、多数の小さなオブジェクトを生成・破棄する場合はオーバーヘッドが大きくなる。また、循環参照は回収できないという致命的な欠点があるため、これだけではGCとは言えない。
- GC: ガベージコレクション。ゴミ収集。不要になったオブジェクトを破棄する機能。
- M&S: マーク・アンド・スイープ。ルートオブジェクトから一つ一つ使っているかどうかマークをしていき、マークが無い物をまとめて回収する方式。循環参照を回収するための最も単純なGC。マークを付けるときに全体を停止(STW)する必要がある。
- コピーGC: マークするのでは無く、別の領域にコピーしていく方式。コピー自体が遅く、二倍弱のメモリが必要になる。
- 世代別GC: 世代別ガベージコレクション。M&SとコピーGCを組み合わせ、オブジェクトを世代に分けることで効率よく回収を行う方式。
- コンカレントGC: STWせずに並列処理でできるだけマーク付けをすることで、STWを極力なくす方式。
- インクリメンタルGC: 少しずつ小まめにできるだけマーク付けをすることで、一回あたりのSTWを短くする方式。
- G1: ガベージファースト・コレクタ。ヒープをいくつかに分割して、余り使っていないヒープを収集、圧縮し、一気に解放する方式らしい。
- STW: Stop the World。時よ止まれ!止まった時の中で動けるのはGCだけ。
【その他】
Teratailのタグでは「ガーベジコレクション」なんですよね。Wikipediaとかは「ガベージコレクション」なんですけど、日本語としてはどちらが正しいのでしょうか。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/04 14:33