「リファレンスカウント式のGC」は、IT界ではGCと認識されていないのだろうか?

  • 19
    いいね
  • 10
    コメント

ツイッターでやりとりした一人の方なのだが、「リファレンスカウント式のGC」は、広義のGCであって、普通に会話で語るときの「GCには含まれない」といわれてしまった。

マークアンドスゥープ以上が「普通の意味のGC」なのか?

Javaは、世代別GCだ。Rubyも世代別GC、Pythonは「マークアンドスウィープ」なのかな。

一方で、Perlは「リファレンスカウント式のGC」だ。

Perlは言語としてGCを持つよっていったら、それは、普通の意味のGCではないといわれてしまった。C++は、ライブラリを使ってGCをするけど、Perlは言語に組み込まれている。

僕は、過去にも、他の人が、PerlはGCがないっていっていたのを見聞きしたことがある。

もしかして、マークアンドスゥープ以上が「普通の意味のGC」と思っている人が結構いるのかな?

リファレンスカウント式のGCも正しく「オブジェクトを回収」できる

リファレンスカウント式のGCは、「循環参照」がなければ、正しくオブジェクトを解放します。

サーバーとしてプログラムが起動しない限りは、循環参照は、問題になることが少ないです。プログラム終了とともに、グローバルデストラクションが走るからです。

また、サーバープログラムで、循環参照があったとしても、片側のオブジェクトを「弱参照」にしてあげれば、オブジェクトは正しく回収されます。

「弱参照(ウィークリファレンスとも呼ばれる)」を使えば、GCで正しくオブジェクトを解放できます。

リファレンスカウント式GCは劣ったGCなのか?

リファレンスカウント式GCは、循環参照を自動解放できないことと、スループットの点で世代別GCに劣ります。

でも「メモリ効率」と「レスポンス時間が平均化」されるという点では、優れています。「レスポンスがFull GCで遅れてメモリチューニングが大変だなぁ」ということがないです。

またスコープの終わりで、オブジェクトを解放できるので、デストラクタが実行されるタイミングを確実にすることができるという利点があります。

IT界における「リファレンスカウント式GC」の認識ってどうなんでしょうか?

追記

希望としてはJunSuzukiJapanさんがコメントで書いてくれたように「GCとは、言語使用者がメモリの確保&解放を明示的に記述することなく、言語側が面倒みてくれること」という定義がよいなぁ。