問題タブ [phantom-reference]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 参照キューに関するファントム参照と弱参照の理解
リンクhttps://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.htmlに従って、PhantomReferencesはオブジェクトがメモリから物理的に削除された場合にのみキューに入れられ、WeakReferencesはファイナライズまたはガベージ コレクションが行われる前にキューに入れられます。実際に起こりました。
違いは、エンキューが発生する正確なタイミングにあります。WeakReferences は、それらが指すオブジェクトが弱く到達可能になるとすぐにキューに入れられます。これは、ファイナライズまたはガベージ コレクションが実際に行われる前です。理論的には、オブジェクトは非正統的な finalize() メソッドによって「復活」することさえできますが、WeakReference は無効なままになります。PhantomReferences は、オブジェクトがメモリから物理的に削除された場合にのみキューに登録され、get() メソッドは常に null を返します。これは、ほとんど死んでいるオブジェクトを「復活」させることができないようにするためです。
一方、http://www.ibm.com/developerworks/library/j-refs/に従って、ヒープ オブジェクトが解放される前にPhantomReferenceがReferenceQueueに追加され、ファイナライズまたはガベージ コレクションの後にWeakReferencesがその ReferenceQueue に追加されます。
ソフト参照や弱参照とは異なり、PhantomReference は、ヒープ オブジェクトが解放される前に ReferenceQueue に追加されます。(すべての PhantomReference オブジェクトは、関連する ReferenceQueue を使用して作成する必要があることに注意してください。) これにより、ヒープ オブジェクトが再利用される前にアクションを実行できます。
ヒープ オブジェクトの finalize() メソッドが実行され、そのメモリが解放されると、WeakReference オブジェクトがその ReferenceQueue に追加されます (存在する場合)。
私は混乱しています。どちらが正しいですか?
基本的に、参照キューに関して弱い参照とファントム参照の違いを知りたいですか?
java - PhantomReference と ReferenceQueue の関係は何ですか?
Java の PhantomReference について少し混乱しています。私がオンラインの記事を見たとき、それらのほとんどは、参照で get() を呼び出しても、PhantomReference オブジェクトは作成後に null を返すと述べており、また、PhantomReference が削除されると、オブジェクトがファントム的に到達可能であり、ReferenceQueue に挿入されると述べています。想い出。
次のコード例を試しましたが、結果に混乱があります。
上記の 2 つのステートメントは null を出力します。pr.get() が null を返す場合、pr によって参照されるオブジェクトがガベージ コレクションされることを意味しますか? そうである場合、オブジェクトがまだ優先キューに追加されていないのはなぜですか?
誰でもこれを明確にするために私を助けてくれますか。PhantomReference と ReferenceQueue に関する私の理解が間違っていたら、お詫び申し上げます。
この 2 つの用語についても簡単に説明してください
どうもありがとう
java - PhantomReference は、参照先のメモリ再利用を停止できますか?
それをすべて要約する私の質問:
- 強力に到達可能な Java PhantomReference は、参照先オブジェクトのメモリがガベージ コレクター (GC) によって再利用されるのを防ぐことができますか?
詳細は次のとおりです。
Callum もこの質問を投稿しましたが、簡単には答えられません。そこでの 1 つの回答は、私の質問に「いいえ」で答えているように見えるEthan Nicholasの記事を参照していますが、それが正しいかどうかはわかりません。
Java API を読んだことに基づいて、質問に「はい」と答える必要があります。
- PhantomReference.clear() が呼び出されず、PhantomReference インスタンス自体が引き続き強く参照されている限り、参照先オブジェクトのメモリが再利用されることはなく、参照先はファントムに到達可能な状態のままになります。
この理解をサポートするために、Java Docsを引用します。
- 「ソフト参照や弱い参照とは異なり、ファントム参照は、キューに入れられるときにガベージ コレクターによって自動的にクリアされません。ファントム参照を介して到達可能なオブジェクトは、そのようなすべての参照がクリアされるか、それ自体が到達不能になるまでそのままになります。」
たとえば、ファントム参照を作成し、そのインスタンスを PhantomReference のリストに保持するとします。次に、その指示対象は、強く到達可能なものから幻の到達可能なものに落ちます。
com.google.common.base.internal.Finalizer.java を見ると、次のコードが表示されます。
Web 検索を行ってリンクを提供するよりも、この件に詳しい人に回答してもらいたいと思います。ありがとう!
java - PhantomReference の使用例
QueueReference
私の知る限り、参照が指すオブジェクトが削除されると、参照が陥ります。
これを実演しようとしていた例ですが、うまくいきません。内部のコードif
は実行されていません。どういう意味ですか。私はそれを間違って使用しましたか?またはGarbageCollector
、実行中に機能しませんでしたか?
java - Java、webdriver、phatom.js が要素の ajax 呼び出しを見つけることができません - ページの応答
最初に、読んでくれてありがとう、そして可能な解決策に感謝したいと思います。
ページで ajax 呼び出し - 応答後に要素を見つけるのに問題があります。ツールとしてJava、webdriver、phantom.jsを使用しています。
私の場合、phantom.js は、ページに iframe がある場合にのみ webelement にアクセスできます。
フレームを作成せずに ajax の応答を待つと、phantom.js は空白のページで要素を検索します。
私の質問は、セレン webdriver、java、phantom.js を使用して、iframe なしで ajax 応答からのすべてのコンテンツを待つ方法ですか? または、ajax 応答中にどのように phantom.js 要素を検索しますか。Chrome ドライバーを使用すると、テストが正常に機能します。
この質問の前に、stackoverflow、google で考えられる回答を調べましたが、適切な解決策が見つかりませんでした。
java - GC 中にファントム参照が解放されない
ファントム参照の使用法に少し混乱しています。ファントム参照のみを指しているオブジェクトは、ガベージコレクターが好きなときにいつでも収集できると読みました。しかし、私の例では意図したとおりに機能していません。
上記の例を実行すると、オブジェクト「strong」が自動的にガベージ コレクションされないことがわかります。「強い」オブジェクトがnullに割り当てられると、オブジェクトが自動的にガベージコレクションされると思っていました。不思議なことに、レジスタ関数で次の行のコメントを外した場合にのみ、ガベージ コレクションが実行されます。
その背後にある理由は何ですか?しかし、Main 関数自体にファントム参照を作成すれば、この問題は発生しません。つまり、次のコードのように、メイン関数内で null に「strong」が割り当てられている場合、オブジェクトは自動的にガベージ コレクションされます。
両方のシナリオで動作が異なるのはなぜですか?
java - null キューを持つ PhantomReference
Java は次のように書くことができます:
この場合new Object()
は回収されますか?
私が理解しているように、ファントム参照はfinalize()
メソッド使用の代替です。
そして、キューに参照が表示された後、いくつかの追加アクションを実行してから実行する必要がありますclear()
Java doc はそのままです:
null キューを使用してファントム参照を作成することは可能ですが、そのような参照はまったく役に立ちません。その get メソッドは常に null を返し、キューを持たないため、キューに入れられることはありません。
エンキューされない場合はどういう意味ですか?
私が理解しているように、メソッドの呼び出しを終了した後、参照が referenceQueue に追加されないことを意味します。
1. オブジェクト メモリがすぐにクリアされる2.
オブジェクト メモリがクリアされない
どの場合が正しいですか?