ガベージコレクションについて調べてみた

Pocket
LINEで送る

なんで調べようと思ったの?

川原です。

「ドラゴンクエストⅩを支える技術」を読んでいて知らない単語がたくさん出てきたので、調べているうちに興味が出て調べてみたら面白かったので。

この本自体は、技術書って感じではなく1,2年目のサーバーやレンダリング部分の詳細を知らない方に向いてる本だなという印象です。

ゲームが好きな自分にとっては興味の幅を広げるという意味では良かったが、刺さる人は少ないかもという印象なのでおすすめはしないです。

ガベージコレクション(GC)とは

どんな機能なの?

直訳すると「ゴミ拾い」「ごみ集め」

プログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放する機能のこと。

動作

従来のメモリ管理では、プログラマがプログラムの実行中においてメモリが必要になる期間を考え、必要になったタイミングでメモリを確保するコードを記述していた。
GCを使用する場合は、メモリの確保するコードは宣言が必要だが解放について記述する必要がなく、GCが判断し解放してくれる。

特徴

自動化することにより、下記のようなバグが回避できる。

  • メモリリークの回避
  • オブジェクトの二重解放の回避
  • 向こうなポインタの回避

また、下記の様にプログラミングスタイルの選択肢を広げる効果も持つ

  • マルチスレッドを活かした言語での記述の簡便化

実装方式

参照カウント方式

オブジェクトを参照するポインタの数を数え、参照するポインタがゼロになったら解放する方法
循環参照の問題や解放が集中した際に単純な実装だと停止時間が長くなってしまう。

マーク&スリープ

オブジェクトから別オブジェクトへの参照をたどり、到達不能オブジェクトを破棄する方法。
多くのLLで採用されている。

コピーGC

通常使用するメモリ領域と同じ容量のメモリ領域をもうひとつ用意し、有効なオブジェクトのみをもう一方のメモリ領域にコピーする方法。

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

マーク&スリープとコピーGCの両方のアルゴリズムを利用した方法。
遅延処理マーク&スリープを遅延処理することが可能
現在のRubyで採用されている。

Stop the World方式

基本的にはGC実行中はプログラムを一時停止する。その止まっている時間をStop the Worldという。
現在は並行処理の手法も確率されている。

インクリメンタル・コンカレント方式

アプリケーションを止めずに、GCを実行することができる。
並行処理を行うのでレイテンシは上がるが、スループットは低下する問題がある。
Goなどで採用されている。

以上です。簡単にですがとめてみました。
直接は関係ない部分が多いですが、調べていて楽しい分野だったので本など読んで更に勉強したいと思います

Pocket
LINEで送る