質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
ガーベジコレクション

ガーベジコレクション(Garbage collection;GC)とは自動的なメモリ領域の管理方法の一つです。不要な情報や、プログラム上で使用されていないオブジェクトによって占有されているメモリ領域を開放しようと試みます。

受付中

言語別GCの仕組み

raccy
raccy

総合スコア21655

ガーベジコレクション

ガーベジコレクション(Garbage collection;GC)とは自動的なメモリ領域の管理方法の一つです。不要な情報や、プログラム上で使用されていないオブジェクトによって占有されているメモリ領域を開放しようと試みます。

4回答

10評価

13クリップ

6219閲覧

投稿2016/04/03 15:58

編集2022/01/12 10:55

ある質問のある回答で、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
PHPM&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とかは「ガベージコレクション」なんですけど、日本語としてはどちらが正しいのでしょうか。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

ガーベジコレクション

ガーベジコレクション(Garbage collection;GC)とは自動的なメモリ領域の管理方法の一つです。不要な情報や、プログラム上で使用されていないオブジェクトによって占有されているメモリ領域を開放しようと試みます。