参照カウント

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピュータサイエンスでは参照カウントは、オブジェクト、メモリブロック、ディスクスペースなどのリソースへ の参照ポインタ、またはハンドルの数を格納するプログラミング手法です。

ガベージコレクションアルゴリズムでは、参照カウントを使用して、不要になったオブジェクトの割り当てを解除できます。

長所と短所

ガベージコレクションのトレースに対する参照カウントの主な利点は、オブジェクトが参照できなくなるとすぐに、収集サイクルを長時間中断することなく、すべてのオブジェクトの有効期間を明確に定義して、段階的にオブジェクトを再利用できることです。リアルタイムのアプリケーションやメモリが限られているシステムでは、これは応答性を維持するために重要です。参照カウントも、実装するメモリ管理の最も単純な形式の1つです。また、メモリよりもはるかに不足していることが多いオペレーティングシステムオブジェクトなどの非メモリリソースの効果的な管理も可能になります(ガベージコレクションシステムのトレースでは、このためにファイナライザーが使用されます。 [要出典]ただし、再生の遅延は問題を引き起こす可能性があります)。加重参照カウントは、分散システムをガベージコレクションするための優れたソリューションです。

1985年の修士論文からの回覧リストの例。[1]長方形は、参照カウントを含むLispペアを示します。入ってくる左上のポインタが削除されても、すべてのカウントは> 0のままです。

ライブオブジェクトのセットが使用可能なメモリのほとんどをいっぱいにした場合、ガベージコレクションサイクルのトレースが頻繁にトリガーされます。[要出典]効率を上げるには余分なスペースが必要です。要出典総空き容量が少なくなっても参照カウント性能が低下することはありません。[2]

参照カウントは、他のランタイム最適化への入力として使用するのに役立つ情報でもあります。たとえば、多くの関数型プログラミング言語などの不変オブジェクトに大きく依存するシステムは、頻繁にコピーされるため、効率が低下する可能性があります。[要出典]ただし、コンパイラ(またはランタイムシステム)が、特定のオブジェクトに参照が1つしかないこと(多くのシステムでほとんど行われているように)、および同様の新しいオブジェクトが作成されると同時に参照が失われることを知っている場合( string appendステートメントのように)、操作を元のオブジェクトのミューテーションに置き換えることができます。 str ← str + "a"

ナイーブな形式での参照カウントには、ガベージコレクションのトレースに比べて2つの主な欠点があり、どちらも改善するために追加のメカニズムが必要です。

  • 頻繁な更新は非効率の原因です。ガベージコレクターのトレースは、コンテキストの切り替えやキャッシュラインの障害によって効率に深刻な影響を与える可能性がありますが、オブジェクトへのアクセスは継続的に行われているため、収集の頻度は比較的低くなります。また、それほど重要ではありませんが、参照カウントでは、すべてのメモリ管理対象オブジェクトが参照カウント用のスペースを予約する必要があります。ガベージコレクターのトレースでは、この情報はそのオブジェクトを参照する参照に暗黙的に格納され、スペースを節約しますが、ガベージコレクター、特にインクリメンタルコレクターのトレースでは、他の目的のために追加のスペースが必要になる場合があります。
  • 上記の素朴なアルゴリズムは処理できません参照サイクルそれ自体を直接または間接的に参照するオブジェクト。参照カウントのみに依存するメカニズムでは、オブジェクトの循環チェーンが削除対象と見なされることはありません。これは、オブジェクトの参照カウントがゼロ以外にとどまることが保証されているためです(図を参照)。この問題に対処する方法は存在しますが、参照カウントのオーバーヘッドと複雑さを増すこともあります。一方、これらの方法は、サイクルを形成する可能性のあるデータ、多くの場合、すべてのデータの小さなサブセットにのみ適用する必要があります。そのような方法の1つは、弱参照、別クリーンアップのために頻繁に呼び出されないマークスイープ

これらに加えて、メモリが空きリストから割り当てられている場合、参照カウントは局所性が低くなります。参照カウントだけではオブジェクトを移動してキャッシュパフォーマンスを向上させることはできないため、高性能コレクターはトレースガベージコレクターも実装します。ほとんどの実装(PHPやObjective-Cの実装など)は、オブジェクトのコピーを実装していないため、キャッシュのパフォーマンスが低下します。[3]

グラフの解釈

ガベージコレクションスキームを扱う場合頂点がオブジェクトであり、AがBへの参照を保持している場合、オブジェクトAからオブジェクトBへのエッジがある有向グラフである参照グラフを考えると役立つことがよくあります。また、ランタイムシステムによって保持されるローカル変数と参照を表す特別な頂点があり、エッジはこれらのノードから他のノードに移動できますが、これらのノードに移動することはありません。

このコンテキストでは、オブジェクトの単純な参照カウントは、その頂点の度数です。頂点を削除することは、オブジェクトを収集することに似ています。これは、頂点に入力エッジがない場合にのみ実行できるため、他の頂点の次数には影響しませんが、他の頂点の次数に影響を与える可能性があり、対応するオブジェクトが収集される場合もあります。結果として、次数も0になります。

特別な頂点を含む連結成分には収集できないオブジェクトが含まれていますが、グラフの他の連結成分にはガベージのみが含まれています。参照カウントガベージコレクションアルゴリズムが実装されている場合、これらのガベージコンポーネントのそれぞれに少なくとも1つのサイクルが含まれている必要があります。そうでなければ、それらは、それらの参照カウント(すなわち、入ってくるエッジの数)がゼロに下がるとすぐに収集されたでしょう。

更新の非効率性への対処

参照が作成または破棄されるたびに参照カウントをインクリメントおよびデクリメントすると、パフォーマンスが大幅に低下する可能性があります。操作に時間がかかるだけでなく、キャッシュパフォーマンスが低下し、パイプラインストールが発生する可能性があります。リストの長さの計算などの読み取り専用操作でさえ、単純な参照カウントを使用した参照更新のために、多数の読み取りと書き込みが必要です。

簡単な手法の1つは、コンパイラーが多数の近くの参照更新を1つに結合することです。これは、作成されてすぐに破棄される参照に特に効果的です。ただし、時期尚早の解放を回避できるように、組み合わせた更新を正しい位置に配置するように注意する必要があります。

参照カウントのDeutsch-Bobrowメソッドは、ほとんどの参照カウントの更新が実際にはローカル変数に格納されている参照によって生成されるという事実を利用しています。これらの参照を無視し、データ構造内の参照のみをカウントしますが、参照カウントがゼロのオブジェクトを削除する前に、システムはスタックのスキャンで検証し、スタックへの他の参照がまだ存在しないことを登録する必要があります。

Henry Bakerによって考案された別の手法には遅延インクリメントが含まれます[4]。ローカル変数に格納されている参照は、対応する参照カウントをすぐにはインクリメントしませんが、必要になるまでこれを延期します。そのような参照がすぐに破棄される場合は、カウンターを更新する必要はありません。これにより、短期間の参照に関連する多数の更新が排除されます(上記のlist-length-countingの例など)。ただし、そのような参照がデータ構造にコピーされる場合は、その時点で遅延インクリメントを実行する必要があります。また、オブジェクトのカウントがゼロになり、早期に解放される前に、遅延インクリメントを実行することも重要です。

LevanoniとPetrankによって、カウンター更新のオーバーヘッドが劇的に減少しました[5] [6]冗長な参照カウントの更新の多くを合体させる、更新合体方法を紹介します。実行の特定の間隔で数回更新されるポインターについて考えてみます。最初にオブジェクトを指しO1、次にオブジェクトを指しO2、以下同様に、間隔の終わりにあるオブジェクトを指すまで続きますOn参照カウントアルゴリズムは通常、、、、、、、、... rc(O1)--rc(O2)++実行rc(O2)--しますただし、これらの更新のほとんどは冗長です。間隔の終わりに参照カウントを適切に評価するには、実行するだけで十分です。rc(O3)++rc(O3)--rc(On)++rc(O1)--およびrc(On)++残りの更新は冗長です。

LevanoniとPetrankは、2001年に、参照カウントコレクターでこのような更新合体を使用する方法を示しました。新しいオブジェクトを適切に処理して更新の合体を使用すると、通常のJavaベンチマークではカウンター更新の99%以上が削除されます。さらに、並列プロセッサでのポインタ更新中のアトミック操作の必要性がなくなります。最後に、彼らは、細かい同期のみを使用するマルチスレッドアプリケーションと同時に実行できる拡張アルゴリズムを提示しました。[7]

2003年のBlackburnとMcKinleyの下位参照カウント方法[8]は、遅延参照カウントとコピーナーサリーを組み合わせて、ポインターの突然変異の大部分が若いオブジェクトで発生することを観察しています。このアルゴリズムは、参照カウントの一時停止時間が短い、最速の世代のコピーコレクターに匹敵するスループットを実現します。

参照サイクルの処理

おそらく、参照サイクルを処理する最も明白な方法は、参照サイクルを作成しないようにシステムを設計することです。システムは、参照サイクルを明示的に禁止する場合があります。ハードリンクのあるファイルシステムは、これを行うことがよくあります。「弱い」(カウントされない)参照の賢明な使用も、保持サイクルを回避するのに役立つ場合があります。たとえば、Cocoaフレームワークでは、親と子の関係には「強い」参照を使用し、子と親の関係には「弱い」参照を使用することを推奨しています。[9]

システムは、何らかの方法で作成されたサイクルを許容または修正するように設計されている場合もあります。開発者は、データ構造内の参照が不要になったときに明示的に「破棄」するコードを設計できますが、これには、データ構造の存続期間を手動で追跡する必要があるというコストがかかります。この手法は、破棄されたときに破棄する「所有者」オブジェクトを作成することで自動化できます。たとえば、Graphオブジェクトのデストラクタは、GraphNodeのエッジを削除して、グラフの参照サイクルを壊す可能性があります。サイクルは、寿命が短く、循環ガベージが少ないシステムでは無視される場合があります。特に、システムが可能な限り循環データ構造を回避する方法を使用して開発された場合、通常は効率が犠牲になります。

コンピューター科学者は、データ構造の設計を変更することなく、参照サイクルを自動的に検出して収集する方法も発見しました。簡単な解決策の1つは、トレースガベージコレクターを定期的に使用してサイクルを再利用することです。サイクルは通常、比較的少量の再利用されたスペースを構成するため、コレクターは、通常のトレースガベージコレクターを使用する場合よりもはるかに少ない頻度で実行できます。

Baconは、同じ理論上の時間範囲を含む、トレースコレクターと類似した参照カウントのサイクル収集アルゴリズムについて説明しています。これは、参照カウントがゼロ以外の値にデクリメントされた場合にのみサイクルを分離できるという観察に基づいています。これが発生するすべてのオブジェクトはルートリストに追加され、プログラムは定期的にルートから到達可能なオブジェクトをサイクルで検索します。参照のサイクルですべての参照カウントをデクリメントすると、それらがすべてゼロになるときに収集できるサイクルが見つかったことを認識しています。[10] Paz etalによるこのアルゴリズムの拡張バージョン。[11]LevanoniとPetrankの更新合体方法を使用することにより、他の操作と同時に実行し、その効率を向上させることができます。[5] [6]

バリアントフォーム

さまざまな方法で単純な参照カウントを増やすことは可能ですが、多くの場合、根本的に異なる方法で参照カウントを実行することで、より良い解決策を見つけることができます。ここでは、参照カウントに関するいくつかのバリエーションと、それらの長所と短所について説明します。

加重参照カウント

加重参照カウントでは、各参照に重みが割り当てられ、オブジェクトは、それを参照している参照の数ではなく、それを参照している参照の合計の重みを追跡します。新しく作成されたオブジェクトへの最初の参照には、216などの大きな重みがありますこの参照がコピーされるたびに、重みの半分が新しい参照に移動し、重みの半分が古い参照に残ります。総重量は変化しないため、オブジェクトの参照カウントを更新する必要はありません。

参照を破棄すると、その参照の重みだけ合計重量が減少します。総重量がゼロになると、すべての参照が破棄されます。重みが1の参照をコピーしようとすると、参照は、合計の重みに追加し、この新しい重みを参照に追加してから分割することにより、「より多くの重みを取得」する必要があります。この状況での代替手段は、間接参照オブジェクトを作成することです。このオブジェクトへの最初の参照は、分割できる大きな重みで作成されます。

参照がコピーされるときに参照カウントにアクセスする必要がないというプロパティは、オブジェクトの参照カウントにアクセスするのに費用がかかる場合、たとえば、別のプロセス、ディスク上、またはネットワーク全体にある場合に特に役立ちます。また、参照カウントをロックして増加させる多くのスレッドを回避することにより、同時実行性を向上させることもできます。したがって、加重参照カウントは、並列、マルチプロセス、データベース、または分散アプリケーションで最も役立ちます。

単純な加重参照カウントの主な問題は、参照を破棄するには参照カウントにアクセスする必要があることです。多くの参照が破棄されると、回避しようとしているのと同じボトルネックが発生する可能性があります。加重参照カウントのいくつかの適応は、死にかけている参照からアクティブな参照に重みを転送することによってこれを回避しようとします。

加重参照カウントは、1987年 にBevan [12]とWatson&Watson [13]によって独自に考案されました。

間接参照カウント

間接参照カウントでは、参照のソースを追跡する必要があります。これは、オブジェクトへの2つの参照が保持されることを意味します。呼び出しに使用される直接参照。また、 Dijkstra–Scholtenアルゴリズムなど、拡散ツリーの一部を形成する間接的なもの。これにより、ガベージコレクターが死んだオブジェクトを識別できるようになります。このアプローチは、オブジェクトが時期尚早に破棄されるのを防ぎます。

使用例

ガベージコレクション

収集アルゴリズムとして、参照カウントは、オブジェクトごとに、他のオブジェクトによって保持されているオブジェクトへの参照の数を追跡します。オブジェクトの参照カウントがゼロに達すると、オブジェクトにアクセスできなくなり、破棄される可能性があります。

オブジェクトが破棄されると、そのオブジェクトによって参照されるオブジェクトの参照数も減少します。このため、単一の参照を削除すると、多数のオブジェクトが解放される可能性があります。一般的な変更により、参照カウントを増分することができます。参照カウントがゼロになるとすぐにオブジェクトを破棄する代わりに、参照されていないオブジェクトのリストに追加され、定期的に(または必要に応じて)このリストの1つ以上のアイテムが追加されます。破壊されました。

単純な参照カウントでは、頻繁に更新する必要があります。参照が破棄または上書きされるたびに、参照するオブジェクトの参照カウントがデクリメントされ、参照が作成またはコピーされるたびに、参照するオブジェクトの参照カウントがインクリメントされます。

参照カウントは、ファイルシステムや分散システムでも使用されます。オブジェクトグラフのサイズとアクセス速度が遅いため、完全な非増分トレースガベージコレクションには時間がかかりすぎます。[14]

コンポーネントオブジェクトモデル

Microsoftのコンポーネントオブジェクトモデル(COM)とWinRTは、参照カウントを広く利用しています。実際、すべてのCOMオブジェクトが( IUnknownインターフェイスで)提供する必要がある3つのメソッドのうちの2つは、参照カウントをインクリメントまたはデクリメントします。多くのWindowsシェルと多くのWindowsアプリケーション(MS Internet ExplorerMS Office、および無数のサードパーティ製品を含む)はCOM上に構築されており、大規模システムでの参照カウントの実行可能性を示しています。

COMでの参照カウントの主な動機の1つは、さまざまなプログラミング言語やランタイムシステム間での相互運用性を実現することです。クライアントは、オブジェクトのライフサイクルを管理するために、オブジェクトメソッドを呼び出す方法を知っているだけで済みます。したがって、クライアントは、COMオブジェクトの実装が使用するメモリアロケータから完全に抽象化されます。典型的な例として、COMオブジェクトを使用するVisual Basicプログラムは、そのオブジェクトがC ++アロケータまたは別のVisualBasicコンポーネントによって割り当てられた(そして後で割り当てを解除する必要がある)かどうかに依存しません。

C ++

C ++は、デフォルトでは参照カウントを実行せず、ユーザーが明示的に要求していない場合にオーバーヘッドが発生する可能性のある機能を追加しないという哲学を満たしています。共有されているが所有されていないオブジェクトには、参照、rawポインター、またはイテレーター(ポインターの概念的な一般化)を介してアクセスできます。

ただし、同じように、C ++は、ユーザーがそのような機能をオプトインするためのネイティブな方法を提供します。C++ 11は、クラスを介して参照カウントスマートポインターstd::shared_ptrを提供し、動的に割り当てられたオブジェクトの自動共有メモリ管理を可能にします。プログラマーは、これを弱ポインタ​​ー(を介して)と組み合わせて使用​​して、std::weak_ptr循環依存関係を解消できます。動的に割り当てられているが共有を目的としていないオブジェクトは、を使用してその存続期間を自動的に管理できますstd::unique_ptr

さらに、C ++ 11の移動セマンティクスは、関数がオブジェクトを返すときに通常使用されるディープコピーを削除することにより、参照カウントを変更する必要がある範囲をさらに減らします。これにより、オブジェクトのポインターの単純なコピーが可能になります。

ココア(Objective-C)

AppleのCocoaおよびCocoaTouchフレームワーク(およびCore Foundationなどの関連フレームワーク)は、 COMと同様に、手動の参照カウントを使用します従来、これはプログラマーが手動でオブジェクトにメッセージをretain送信することで実現されていましたが、 iOS 5 [15]およびMacOS X 10.7では、必要に応じてこれらのメッセージを自動的に挿入するClangコンパイラ機能である自動参照カウントが追加されました。[16] Mac OS X 10.5は、参照カウントの代わりにトレースガベージコレクターを導入しましたが、OS X10.8では非推奨になりました。release macOSSierraObjective-Cランタイムライブラリから削除されました。[17] [18] iOSはトレースガベージコレクターをサポートしたことがありません。

Delphi

Delphiは、ほとんどの場合、ガベージコレクション言語ではありません。ユーザー定義型は手動で割り当ておよび割り当て解除する必要がありますが、文字列、動的配列、インターフェイスなどのいくつかの組み込み型の参照カウントを使用した自動収集を提供します。使いやすさと一般的なデータベース機能を簡素化するため。組み込み型を使用するかどうかを決定するのはプログラマー次第です。Delphiプログラマーは、C / C ++のように低レベルのメモリ管理に完全にアクセスできます。したがって、Delphiの参照カウントの潜在的なコストはすべて、必要に応じて簡単に回避できます。

Delphiで他の形式のガベージコレクションよりも参照カウントが優先される理由には、次のようなものがあります。

  • 迅速な収集など、参照カウントの一般的な利点。
  • ガベージコレクションされた組み込み型は再帰的ではないため、サイクルは発生しないか、実際には発生しません。(インターフェースを使用すると、そのようなシナリオを作成できますが、それは一般的な使用法ではありません)
  • 参照カウントに必要なコードサイズのオーバーヘッドは非常に小さく(ネイティブx86では、通常、単一のLOCK INC、LOCK DEC、またはLOCK XADD命令であり、あらゆる環境で原子性が保証されます)、収集に個別の制御スレッドは必要ありません。トレースガベージコレクターに必要です。
  • 最も一般的に使用されるガベージコレクションタイプである文字列の多くのインスタンスは、通常、文字列操作の中間値であるため、存続期間が短くなります。ローカル文字列の使用法の多くは最適化できますが、コンパイラは現在それを行いません。
  • 文字列を変更する前に、文字列の参照カウントがチェックされます。これにより、参照カウント1の文字列を直接変更でき、参照カウントの高い文字列は変更前にコピーされます。これにより、すべての割り当てで文字列をコピーするコストを排除しながら、古いスタイルのパスカル文字列の一般的な動作を維持できます。
  • ガベージコレクションは組み込み型でのみ実行されるため、参照カウントは、各データ型の操作に使用されるライブラリルーチンに効率的に統合でき、参照カウントの更新に必要なオーバーヘッドを低く抑えることができます。さらに、ランタイムライブラリの多くは手動で最適化されたアセンブラにあります。
  • 文字列型はcharへのポインタにキャストでき、その方法で高性能操作を実行できます。DelphiとFPCの両方がPascalでRTLを実装しているため、これは重要です。他のさまざまな自動化されたタイプには、そのようなキャストオプションがあります。

GObject

GObjectオブジェクト指向プログラミングフレームワークは、弱参照を含むその基本型に基づいて参照カウントを実装ます参照のインクリメントとデクリメントは、スレッドセーフのためにアトミック操作を使用します。高水準言語からGObjectへのバインディングを作成する際の作業のかなりの部分は、言語独自のメモリ管理システムで動作するようにGObject参照カウントを適応させることにあります。

Valaプログラミング言語は、コピーを多用する文字列処理とともに、主要なガベージコレクションシステムとしてGObject参照カウントを使用します。[19]

Perl

Perlは、循環参照を特別に処理せずに参照カウントも使用しますが、(上記のCocoaおよびC ++のように)Perlは弱参照をサポートしているため、プログラマーはサイクルの作成を回避できます。

PHP

PHPは、内部変数管理に参照カウントメカニズムを使用しています。[20] PHP 5.3以降、ベーコンの上記の論文のアルゴリズムを実装しています。PHPでは、ユーザーレベルの関数を使用してサイクルコレクションのオンとオフを切り替えることができます。また、手動でパージメカニズムを強制的に実行することもできます。

Python

Pythonは参照カウントも使用し、サイクル検出も提供します(そしてそれらを再利用できます)。[21]

さび

Rustは、コードで宣言されたライフタイムを使用してメモリを解放します。RustにはRcArc構造体があります。

タイプは、ヒープに割り当てられたRc<T>タイプの値の共有所有権を提供します。[22]T

std :: rc :: Rcを使用します; 

struct  Cat { 
    文字列
}

fn  main (){ 
    cat = Cat { color"black"とます。to_string ()};      
    cat = Rc :: new cat ;   
}

リス

Squirrelは、サイクル検出で参照カウントを使用します。この小さな言語は、ビデオゲーム業界以外では比較的知られていません。ただし、これは、参照カウントがどのように実用的かつ効率的になるかを示す具体的な例です(特にリアルタイム環境で)。[要出典]

Tcl

Tcl 8は、値のメモリ管理に参照カウントを使用します(Tcl Obj structs)。Tclの値は不変であるため、参照サイクルを形成することは不可能であり、サイクル検出スキームは必要ありません。値を変更されたコピーで置き換える操作は、通常、参照カウントが共有されていないことを示している場合に元のコピーを変更するように最適化されます。参照はデータ構造レベルでカウントされるため、上記で説明した非常に頻繁な更新に関する問題は発生しません。

Xojo

Xojoは、循環参照を特別に処理せずに参照カウントも使用しますが、(上記のCocoaおよびC ++のように)Xojoは弱参照をサポートしているため、プログラマーはサイクルの作成を回避できます。

ファイルシステム

多くのファイルシステムは、特定のブロックまたはファイルへの参照カウントを維持します。たとえば、Unixスタイルのファイルシステムのiノード リンクカウント、通常、ハードリンクと呼ばれます。カウントがゼロに達すると、ファイルの割り当てを安全に解除できます。ディレクトリからの参照は引き続き可能ですが、一部のUnixはライブプロセスからの参照のみを許可し、ファイルシステム階層の外部にファイルが存在する可能性があります。

参考文献

  1. ^ ケビンG.キャシディ(1985年12月)。LISP環境での同時プログラム実行による自動ストレージ再生の実現可能性 (PDF)(修士論文)。海軍大学院、モントレー/カリフォルニア州。こちら:p.25
  2. ^ Wilson、Paul R.(1992)。「ユニプロセッサガベージコレクションテクニック」メモリ管理に関する国際ワークショップの議事録英国ロンドン:Springer-Verlag。pp。1–42。ISBN 3-540-55940-Xセクション2.1。
  3. ^ Rifat Shahriyar、Stephen M. Blackburn、Xi Yang、Kathryn S.McKinley(2013)。「参照カウントImmixで手袋を脱ぐ」(PDF)オブジェクト指向プログラミングシステム、言語、およびアプリケーションに関する第24回ACMSIGPLAN会議OOPSLA 2013. doi10.1145 /2509136.2509527 {{cite conference}}:CS1 maint:複数の名前:著者リスト(リンク
  4. ^ ヘンリーベイカー(1994年9月)。「機能データ構造の遅延およびアンカーポインタを使用した参照カウント更新の最小化」。ACMSIGPLANの通知29(9):38–43。CiteSeerX10.1.1.25.955_ 土井10.1145 /185009.185016S2CID14448488_  
  5. ^ a b Yossi Levanoni、Erez Petrank(2001)。「Java用のオンザフライの参照カウントガベージコレクター」オブジェクト指向プログラミング、システム、言語、およびアプリケーションに関する第16回ACMSIGPLAN会議の議事録OOPSLA 2001. pp。367–380。土井10.1145 /504282.504309
  6. ^ a b Yossi Levanoni、Erez Petrank(2006)。「Java用のオンザフライの参照カウントガベージコレクター」ACMトランス。プログラム。ラング。Syst28:31–69。CiteSeerX10.1.1.15.9106_ 土井10.1145 /1111596.1111597S2CID14777709_  
  7. ^ 「オンザフライリファレンス-Java用のガベージコレクターのカウント」(PDF)Cs.technion.ac.il 2017年6月24日取得
  8. ^ スティーブンブラックバーン; キャスリン・マッキンリー(2003)。「UlteriorReferenceCounting:長い待ち時間のない高速ガベージコレクション」(PDF)オブジェクト指向プログラミング、システム、言語、およびアプリケーションに関する第18回ACMSIGPLAN会議の議事録OOPSLA 2003. pp。344–358。土井10.1145 /949305.949336ISBN  1-58113-712-5
  9. ^ 「Mac開発者ライブラリ」Developer.apple.com 2015年12月17日取得
  10. ^ ベーコン、デビッドF。; ラジャン、VT(2001)。「参照カウントシステムでの同時サイクル収集」(PDF)ECOOP 2001 —オブジェクト指向プログラミングコンピュータサイエンスの講義ノート。2072. pp。207–235。土井10.1007 / 3-540-45337-7_12ISBN  978-3-540-42206-82004年7月23日にオリジナル (PDF)からアーカイブされました。
  11. ^ Harel Paz、David F. Bacon、Elliot K. Kolodner、Erez Petrank、VT Rajan(2007)。「効率的なオンザフライサイクルコレクション」。プログラミング言語とシステムに関するACMトランザクション29(4):20–es。CiteSeerX10.1.1.10.2777_ 土井10.1145 /1255450.1255453S2CID4550008_  {{cite journal}}:CS1 maint:複数の名前:著者リスト(リンク
  12. ^ Bevan、DI(1987)。「参照カウントを使用した分散ガベージコレクション」。ボリュームII:PARLEの並列言語:並列アーキテクチャと言語ヨーロッパオランダ、アイントホーフェン:Springer-Verlag。pp。176–187。ISBN 0-387-17945-3
  13. ^ ワトソン、ポール; ワトソン、イアン(1987)。「並列コンピュータアーキテクチャのための効率的なガベージコレクションスキーム」。ボリュームII:PARLEの並列言語:並列アーキテクチャと言語ヨーロッパオランダ、アイントホーフェン:Springer-Verlag。pp。432–443。ISBN 0-387-17945-3
  14. ^ ブルーノ、ロドリゴ; フェレイラ、パウロ(2018)。「ビッグデータ環境のためのガベージコレクションアルゴリズムに関する研究」。ACMコンピューティング調査51:1–35。土井10.1145 / 3156818S2CID21388487_ 
  15. ^ [1] 2011年6月9日にウェイバックマシンでアーカイブ
  16. ^ 「Mac開発者ライブラリ」Developer.apple.com 2015年12月17日取得
  17. ^ ジョン・シラクサ(2012年7月25日)。「OSX10.8 Mountain Lion:ArsTechnicaレビュー」ArsTechnicaセクション「Objective-Cの機能強化」で。2016年11月17日取得
  18. ^ 「Xcode8リリースノート」AppleDeveloper2016年10月27日。2017年3月19日のオリジナルからアーカイブ2017年3月19日取得
  19. ^ 「Projects / Vala / ReferenceHandling-GNOME Wiki!」GNOME。2015年5月25日2015年12月17日取得
  20. ^ 「PHP:参照カウントの基本-マニュアル」www.php.net 2020年10月1日取得
  21. ^ "1.CまたはC ++によるPythonの拡張— Python2.7.11ドキュメント"Docs.python.org。2015年12月5日2015年12月17日取得
  22. ^ "std :: rc-Rust"doc.rust-lang.org 2020年11月2日取得

外部リンク