2014-01-08 17 views
8

2つのオブジェクトが互いの所有権を主張している(互いに参照を持っている)とき、保持サイクル(少なくともObjective-CとSwiftでは)がわかっています。 Objective-Cでは、weakのいずれかを宣言することで問題を解決できます。Javaの保持サイクル(ガベージコレクション)

私が読んで理解したことから、Java GCは保持サイクルの影響を受けず、weakの参照を心配する必要はありません。どのようにそれを解決するのですか?

+0

リファレンスカウントは使用していません。ゴミを探す代わりに、実際にはアクティブ/強く到達可能なオブジェクトを探し、残りのオブジェクトを再利用します。 –

答えて

15

Javaのガベージコレクタは、ルートから「到達可能な」オブジェクトを検索することによって動作します。到達できない場合(外側のオブジェクト参照がない場合)、オブジェクトグラフ全体が破棄されます。

基本的には、ルートからリーフノードまでツリーをたどり、検出したすべてのオブジェクトをマークします。ヒープ内のマークされたオブジェクトによって占有されていないメモリはすべて掃除されます(空きとしてマークされます)。これはmark and sweepと呼ばれます。それはreference countingを使用するためのimg SRC

Mark and sweep in action

これは、彼らがされていない場合ので、ノーサイクルが保持することが可能な理由があるhas it's flaws

マークアンドスイープない、で簡単に行うことができませんどこの "ツリー"にリンクされていても、マークされておらず、廃棄することができます。

+1

リンクされたウェブサイトhttp://www.brpreiss.com/books/opus5/html/page421.htmlはハッキングされているようです...クリックしないで、リンクを修正するオンラインアーカイブを見つけることができますか? –

+0

ありがとうございます。 –

0

名前が示すように、ガベージコレクションは、もはや使用されていないオブジェクト を削除することを指します。スコープオブジェクトの に関係なく、Javaはオブジェクトをヒープに格納することはよく知られています。したがって、ヒープをクリアせずにオブジェクトを作成する場合は、 を保存すると、コンピュータがヒープ領域外に を実行し、「メモリ不足」エラーが発生する可能性があります。ガベージコレクションJavaの は、Java 仮想マシン(JVM)によって制御されて実行され、使用されなくなった オブジェクトによって占有されているヒープ領域を解放するメカニズムです。 C++とは対照的に、Javaのゴミ箱 コレクションは、メモリ管理 関連アクティビティから開発者を復活させます。 JVMはこのプロセスを、 'Garbage Collector'と呼ばれる デーモンスレッドの助けを借りて実行します。ガベージコレクタ スレッドは、最初にオブジェクトのfinalizeメソッドを呼び出します。これは前記オブジェクトに対するクリーンアップ活動を 実行する。開発者としては、 はJVMにガベージコレクタスレッドを強制的に実行させることができません。 のメソッド、例えばRuntime.gc()またはSystem.gc()がありますが、これらのどれもが ガベージコレクタスレッドの実行を保証していません。これらのメソッドは、 にJVMにガベージコレクション要求を送信するために使用されます。ガベージコレクションプロセスを開始するのは、Java 仮想マシンまでです。

このようなもの基本的な用語で

How Garbage Collection works in Java

0

を見てみましょう、ガベージコレクションは、事前に定義された根の数からオブジェクトグラフを歩いて動作します。これらのルーツからアクセスできないものはゴミです。したがって、1つまたは複数のルートからアクセスできる場合を除いて、別のオブジェクトを参照するオブジェクトは無関係です。

詳しくはHow Garbage Collection Really Worksで説明しています。

4

ガベージコレクタは、ルート(通常は呼び出しスタック上の変数またはグローバル変数)から開始して、到達可能なオブジェクトを探します。したがって、2つのオブジェクトが互いに参照していても到達可能でない場合、「ライブ」としてフラグが立てられず、収集されます。

関連する問題