読み込み中...参照カウント(さんしょうカウント、)は、ガベージコレクタの動作方法の一つ。
この方法は処理が高速であることが特長である。オブジェクトを多数生成し、すぐに参照を切るような処理においても、参照がなくなったことがその場で検知され、迅速に破棄が起きる。利用できるメモリが少ない状況では大きな利点となる。ただ、不要になったオブジェクト同士が循環参照している場合、参照カウントが0にならないためにオブジェクトが破棄されないという問題がある。
また、参照カウントが頻繁に書き変わる場合には書き換え負荷そのものが問題になる場合もある。さらに、単純な実装では大量のオブジェクトが一斉に解放されることがあり、CPUの空き時間を利用してガベージコレクションを行う方法と比べると、メモリの解放で処理が遅くなってしまう場合もある。
参照カウントには、循環参照により到達不能なデータでも解放できないという問題がある。
class A {
public B b;
}
class B {
public A a;
}
public class Test {
public static void main(String[] args) {
A a = new A(); // *1*
B b = new B(); // *2*
a.b = b;
b.a = a;
a = null;
b = null;
// *1*、*2*で作成したAとBのオブジェクトは到達不可能にもかかわらず、参照カウントは1
}
}
この問題を防ぐためには、多くの言語・システムでウィークリファレンスが導入される。
ウィークリファレンスとは、参照カウントを増加させないポインタである。
ウィキペディアの「孤立した記事」は、参照カウントが0のものを表示しているだけなので、孤立した記事だけから参照されている記事は孤立した記事と見なされていない(これも循環参照の例である)。
上で述べた問題を回避する方法としてマーク・アンド・スイープがある。
読み込み中...