1。参照タイプ(強力な参照を除く)
参照の直接サブクラスはJVMによって処理されていることが理解できます。そのため、コード内の参照タイプを直接継承することには影響しません。サブクラスからのみ継承できます。対応するサブクラスタイプには、以下が含まれます。 (Jnireferenceなど、Javaで使用されていないものを無視してください)
softreference
弱者
最終参照
幻想
上記の参照タイプは、対応するJavadocでも言及されています。 finalReferenceは、ファイナライズ方法用に特別に設計されており、他にもいくつかの特定のアプリケーションシナリオがあります。その中でも、ソフトランスはメモリ関連のキャッシュで使用され、リサイクルに関連するほとんどのシナリオでは弱者が使用されます。 Phantomreferenceは、オブジェクトのリサイクルパッケージング(リソース漏れ検出など)のコールバックシナリオで使用されます。
IDEのいくつかのタイプのサブクラス情報を直接表示して、対応するタイプを継承することにより、ほとんどのフレームワークで使用されているシナリオを理解して、タイプ選択処理を実際に実行できるようにできます。
2。参照コンストラクター
内部で2つのコンストラクターを提供します。1つはキューを備え、もう1つはキューのないものです。キューの意味は、このキューを外部的に監視できることです。つまり、オブジェクトをリサイクルしようとしている場合、対応する参照オブジェクトがこのキューに配置されます。参照を取得したら、さらにトランザクションを実行できます。
そうでない場合は、参照オブジェクトのみを継続的にトレーニングし、Get InsidがNullを返すかどうかを判断できます(Phantomreferenceオブジェクトはこれを実行できません。Getは常にnullを返します。どちらの方法でも、実際のアプリケーションに応じて、対応する使用シナリオがあります。たとえば、WeakHashmapでは、キューデータを照会して、オブジェクトがリサイクルされるかどうかを判断することを選択します。 ThreadLocalMapの場合、get()が処理のためにnullであるかどうかを判断するために使用されます。
対応するコンストラクターは次のとおりです。
Reference(t Reference){this(referent、null);} reference(t reference、referencequeue <?super t> queue){this.referent = referent; this.queue =(queue == null)?参照queue.null:queue;}ここのヌルキューは、キュー内のデータの処理を必要としないキューとして理解できます。また、内部のデータにアクセスしません。
上記のオブジェクトでは、参照が参照するオブジェクト、つまり、それを構築するときにラップする必要があるオブジェクトを表します。オブジェクトがリサイクルされようとしているという定義は、このオブジェクトが参照を除いて他の参照を持っていないことを意味します(実際に参照されていないというわけではありませんが、GCROOTのアクセシビリティは循環参照の問題を回避するために到達できません)。
キューは、オブジェクトがリサイクルされたときに通知されるキューです。オブジェクトがリサイクルされると、参照オブジェクト全体(リサイクルオブジェクトではありません)がキューに配置され、外部プログラムはこのキューを監視することにより対応するデータを取得できます。
3。参照および参照リファレンスチェーン
ここのキューは名目上キューですが、内部には実際のストレージ構造はありません。そのストレージは、内部ノード間の関係に依存します。キューはリンクリストに似た構造であり、ここのノードが実際に参照自体であることを理解できます。キューは、現在のヘッドノードのみを保存するリンクリストのコンテナであり、次のノードは次の各参照ノード自体によって維持されるリンクリストのコンテナであることが理解できます。
参照ステータス値
各参照オブジェクトには、クエリ、ポジショニング、または処理の利便性のために、対応する状態説明があります。
1。アクティブ:アクティブ状態、つまり、対応するオブジェクトは強力な参照状態であり、リサイクルされていません。この状態では、オブジェクトはキューに配置されません。この状態では、次はnullであり、キューは定義されたときに参照されるキューです。
2。保留中:キューに入れる準備をします。この状態では、処理されるオブジェクトがキューに1つずつキューに入ります。この時間ウィンドウ中、対応するオブジェクトは保留中の状態にあります。どの参照に関係なく、この状態に入ると、対応する状態では、次はそれ自体(JVMによって設定)であり、キューは定義されたときに参照されるキューであると考えることができます。
3。Enqueued:対応するオブジェクトはすでにリサイクルされており、対応する参照オブジェクトはキューに配置されています。外部スレッドは、対応するデータを取得するためにキューを照会する準備ができています。この状態では、次は処理される次のオブジェクトであり、キューは特別な識別オブジェクトが排除されます。
4。非アクティブ:つまり、このオブジェクトは外部からキューから取得され、処理されました。つまり、この参照オブジェクトはリサイクルでき、内部にカプセル化されたオブジェクトもリサイクルできます(実際のリサイクル操作は、明確なアクションが呼び出されるかどうかによって異なります)。この状態に入る人々はリサイクルされなければならないことを理解できます。
JVMは、対応する参照がどの状態にあるかを決定するために状態値を定義する必要はありません。次に計算して、判断を下すためにキューを計算する必要があります。
4。参照#ヘッド
現在のキューで処理する最新ノードを常に保存してください。キューを最後の最初のキューと見なすことができます。新しいノードが入ると、次のロジックが採用されます。
newe.next = head; head = newe;
次に、取得するときに、対応するロジックを使用します
tmp = head; head = tmp.next; return tmp;
V.参照#次へ
つまり、処理されようとしている参照ノードによって保存されている次のノードを説明してください。ただし、次はキューに配置された場合にのみ意味があります。対応するステータス値を説明するために、キューに配置された後、そのキューはキューを参照しなくなります。代わりに、特別なエンキューを指します。キューに配置されているため、再びキューに配置されません。
6。参照#参照
つまり、現在の参照によって参照される実際のオブジェクトを説明します。これは、注釈に記載されているように慎重に処理されます。つまり、このことがリサイクルされ、リサイクルされると、直接nullに設定され、外部プログラムはリサイクル動作が発生することを参照オブジェクト自体から(指示対象ではなく)学習できます。
7。参照#enqueue保留中の参照enqueue
このプロセスは、active-> pending-> enquedからの参照オブジェクトのプロセスです。この方法は、保留中の状態を有効な状態として処理するオブジェクトを処理することです。対応するプロセスは以前のロジックです。つまり、ノードが囲まれており、対応するコードは次のとおりです。
r.queue = enqueued; r.next =(head == null)? r:head; head = r; queuelength ++; lock.notifyall();
最後のnitifyとは、以前に現在のキューでブロックされる外部プログラムに通知することを意味します。 (つまり、保留中のオブジェクトは以前に取得されていません)
8。リファレンス#TryHandlePending
つまり、参照オブジェクトの変更をアクティブ状態から保留中の状態に処理します。参照オブジェクト内には静的フィールドがあり、対応する宣言は次のとおりです。
/* enqueuedを待っている参照のリスト。コレクターはこのリストへの参照 *を追加し、参照ハンドラースレッドはそれら *を削除します。このリストは、上記のロックオブジェクトによって保護されています。 *リストは、発見されたフィールドを使用して要素をリンクします。 */private static Reference <Object> pending = null;
JVMがGCの場合、この静的フィールドでオブジェクトを処理するオブジェクトを配置することを理解できます。同時に、発見された別のフィールドは、処理されるオブジェクトの次のオブジェクトを表します。つまり、処理されるオブジェクトもリンクされたリストであると理解できます。発見を通じてキューに巻き込まれています。保留され続けるだけで、発見を通じて次のオブジェクトを継続的に取得する必要があります。両方のスレッドがこの保留中のオブジェクトにアクセスする可能性があるため、ロック処理を使用する必要があります。
対応する処理プロセスは次のとおりです。
if(保留!= null){r = pending; // 'instanceof'は時々offmemoryErrorを捨てるかもしれません//「保留中の」チェーンから「r」をリンクする前にこれを行う... c = r cleanof cleener? (クリーナー)R:null; //「保留中」チェーンから 'r'を解除してください保留中= r.discovered; r.discovered = null;} //処理オブジェクトをenqueue、つまり、enqued状態参照クロスに入ります<?スーパーオブジェクト> q = r.queue; if(q!= referencequeue.null)q.enqueue(r);9。参照#クリア
参照オブジェクトによって参照される元のオブジェクトをクリアして、get()メソッドを介して元のオブジェクトにアクセスできなくなるようにします。対応するデザインのアイデアから、キューオブジェクトを入力したため、元のオブジェクトに再びアクセスする必要がないため、対応するオブジェクトをリサイクルする必要があることを意味します。この方法はJVMによって呼び出されず、JVMはフィールド操作を通じて対応する参照を直接クリアし、その特定の実装は現在の方法と一致しています。
クリアのセマンティクスは、参照をnullすることです。
WeakReferenceオブジェクトがキューに入ると、対応する参照はnullです。
softreferenceオブジェクトは、メモリで十分な場合にオブジェクトがキューに入力しない場合、対応する参照はnullになりません。処理する必要がある場合(メモリやその他のポリシーが十分ではありません)、対応する参照はnullに設定され、キューに入ります。
finalReferenceオブジェクトは、その参照がキューに入力されたとしても、その参照がキューに入力されたとしても、その参照はnull、つまりクリアされないため、そのファイナライズオブジェクトを呼び出す必要があるためです。
nullを返すように実装されたGet自体があまり役に立たないため、Phantomreferenceオブジェクトはオブジェクトです。それがenqueueであるかどうかに関係なく、それはクリアされないからです。
10。参照ハンドラーEnqueueスレッド
上記のように、JVMはオブジェクトを保留中のオブジェクトに処理するように設定するため、連続ENQUEUE操作を実行するためのスレッドが必要です。このスレッドはプロセッサスレッドを指し、その優先順位はmax_priority、つまり最高です。対応するスタートアッププロセスは静的初期化が作成されます。これは、参照オブジェクトまたはクラスが使用されるときに理解できます。このスレッドは作成および開始されます。対応するコードは次のとおりです。
static {threadgroup tg = thread.currentthread()。getThreadGroup(); for(threadgroup tgn = tg; tgn!= null; tg = tgn、tgn = tg.getparent()); Thread Handler = new ReferenceHandler(TG、 "Reference Handler"); / * * max_priorityよりも大きい特別なシステムのみの優先度がある場合、ここで使用されます */ handler.setpriority(thread.max_priority); Handler.SetDaemon(True); handler.start();}その優先事項は最高であり、参照オブジェクトを継続的に処理する必要性として理解できます。 jstackに実行されているスレッドを印刷するとき、対応する参照ハンドラーは、以下に示すように、ここで初期化されたスレッドを指します。
11。JVM関連
上記の各処理ポイントでは、JVMリサイクルプロセスに関連しています。つまり、GCプロセスは、対応する参照と組み合わせて機能すると考えられています。たとえば、CMSコレクターを使用すると、前のプロセス全体と、ソフトレファレーションのースネア処理などに同時に、参照オブジェクトのさまざまな処理も特定のタイプに関連する必要があります。対応するJVM処理はC ++コードを使用するため、慎重に整理する必要があります。
12。概要
FinalReferenceオブジェクトと同様に、リファレンスとリファレンスキュー全体は、一緒に機能する処理グループのグループです。異なる参照セマンティクスを確保するために、JVM GCに関連するプロセスが、さまざまなシナリオと異なる参照レベルで最終的に実現されます。
さらに、リファレンスキューとオープニングスレッドを使用してキューを監視するのは面倒で複雑であるためです。 Google Guavaと対応するFanimalizablereferenceオブジェクトによって実装されたFanimalizableReferenceQueueを参照できます。処理プロセスは少し単純化できます。上記はこの記事の全体的な内容であり、私はそれがすべての人の学習や仕事にいくらかの助けをもたらすことを願っています。