問題タブ [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.

0 投票する
2 に答える
423 参照

java - PhantomReference が機能しないのはなぜですか?

デモコード:

コードをテストしましたが、常にデッド ループです。コード (System.out.println(1111111);) は実行できません。q.poll() は null を返します。

テスト オブジェクトが GC によって削除された場合、q.poll() は p オブジェクトを返し、ループを中断すると思いますが、このデモ コードを呼び出すと、私の考えとは異なります。

編集済み: デモ コードを変更しました。現在は動作します。

sb が言うように、ステートメント ( test=null) は key.GC が null を割り当てるテスト オブジェクトを収集します。

0 投票する
2 に答える
822 参照

java - PhantomReference / SoftReference / WeakReferenceがキューに入れられている場合、それが何を参照しているかをどのように知ることができますか?

PhantomReferencesを使用していません。実際の使用例はほとんどないようです。

ファントムがキューに表示された場合、それがどのオブジェクトであるか、またはどのオブジェクトであったかをどのようにして知ることができますか?get()メソッドは役に立たないようです。JavaDocによると、

ファントム参照の指示対象には常にアクセスできないため、このメソッドは常にnullを返します。

オブジェクトがシングルトンでない限り、常にPhantomReferenceのサブクラスを使用する必要があると思います。このサブクラスには、何が死んだのかを理解するために必要なメモを配置します。

これは正しいですか、それとも私は何かを逃しましたか?

これはSoftReferencesにも当てはまりますか?弱参照の場合?

関連する使用例へのリンクは素晴らしいでしょう。

0 投票する
4 に答える
1778 参照

java - GC が到達不能と判断した複雑な Java オブジェクトをリサイクルする方法はありますか

C++ では、参照カウント オブジェクトを使用して、「自動」リサイクル オブジェクト プールの for を実装します。

-- これで、refcount が 0 に達したときに呼び出される "onFinalRelease()" メソッドが C++ オブジェクトにあります。これをオーバーライドして (デフォルトは delete(this) です)、オブジェクトを破棄するのではなく、オブジェクトを自動リサイクルすることができます。

問題は、Java 参照型と参照プールを組み合わせてこのパターンを実装できるかどうかです。もちろん、これは意味のあるオブジェクトを作成するのにコストがかかる大規模な複雑なタイプのためのものです。それは私がやりたいことです:

これは本当にいいでしょう:)

0 投票する
7 に答える
94268 参照

java - Java: 強い参照、弱い参照、弱い参照、ファントム参照の違い

Java のさまざまなタイプの参照 (強い、弱い、弱い、ファントム) に関するこの記事を読みましたが、よくわかりません。

これらの参照型の違いは何ですか? また、各型はいつ使用されますか?

0 投票する
1 に答える
9883 参照

java - Javaでファントム参照を使用するのはいつですか?

さまざまな種類のリファレンスについて読みました。強い参照、弱い参照、弱い参照がどのように機能するかを理解しています。

しかし、ファントムリファレンスについて読んだとき、私はそれらを本当に理解できませんでした. たぶん、それらの目的が何であるか、またはそれらをいつ使用するかを示す良い例を見つけることができなかったからです.

ファントム参照を使用するコード例をいくつか示していただけますか?

0 投票する
0 に答える
105 参照

java - Java:PhantomReferenceの実用化?

重複の可能性:
プロジェクトでファントム参照を使用したことがありますか?

PhantomReferenceの実際の使用法は何ですか?'get'は常にnullを返すため、それらが指すオブジェクトにはアクセスできません。それで、それらの用途は何ですか?サブクラス化によって(WeakHashMapでWeakReferenceがサブクラス化されるのと同様に)?

0 投票する
5 に答える
5339 参照

java - Javaでウィークリファレンスとファントムリファレンスを使用する場合

多くの記事を読みましたが、わかりません。実際には、弱およびファントム参照をどこで使用する必要がありますか?ソフト参照-私が理解しているように、キャッシュには良い選択です。しかし、弱くて幻想的で、いつ使うべきかわかりません。それらを使用する必要がある実際のタスクの例を提供してください。

0 投票する
4 に答える
1773 参照

java - Java:PhantomReference、ReferenceQueue、およびファイナライズ

PR、PRが指すオブジェクトO、およびPR用に設定されたRQがあります。RQをポーリングし続けるスレッドがあり、RQで最初に見つかった参照で、スレッドはそれを見つけた時刻を出力して終了します。

物事は正常に機能しますが、Oがファイナライズを行うと(どんなに些細なことでも)、スレッドはRQで参照を検出しなくなり、無期限に実行を続けます。

質問:なぜそれがこのように起こるのですか?私はSunJDK1.6を使用しています。

コードは次のとおりです。

good case

bad case

のSOPのコメントを外すだけfinalize()ですGCPhantomObject

0 投票する
1 に答える
273 参照

java - Why won't my objects die?

I'm trying to implement a mechanism that deletes cached files when the objects that hold them die, and decided to use PhantomReferences to get notified on garbage collection of an object. The problem is I keep experiencing weird behavior of the ReferenceQueue. When I change something in my code it suddenly doesn't fetch objects anymore. So I tried to make this example for testing, and ran into the same problem:

The output is:

Needless to say, changing the sleep time, calling gc multiple times etc. didn't work.

UPDATE

As suggested, I called Reference.enqueue() of my reference, which solved the problem.

The weird thing, is that I have some code that works perfectly (just tested it), although it never calls enqueue. Is it possible that putting the Reference into a Map somehow magically enqueued the reference?

Some filtered output:

2013-08-05 22:35:01,932 DEBUG Save image to file: <>\AppData\Local\Temp\tmp7..0.PNG

2013-08-05 22:35:03,379 DEBUG Deleting unused file: <>\AppData\Local\Temp\tmp7..0.PNG created at Mon Aug 05 22:35:02 IDT 2013

0 投票する
2 に答える
150 参照

java - PhantomReferences を使用したファイナライズ中にリフレクションを使用しないようにしますか?

Closable を実装するクラス MyClass を作成したとしましょう。したがって、close() メソッドでは、いくつかの非常に重要なリソースを解放します。非常に重要なリソースであるため、ある種の安全ネットワークを作成しました (Effective Java で推奨されているように)。ここにあります:

最初はとても嬉しかったのですが、後でファイナライザーはそれほどクールではなく、PhantomReference のようなクールなツールがあることを知りました。そこで、finalize() メソッドの代わりに PhantomReference を使用するようにコードを変更することにしました。PhantomRefernce を拡張した CustomPantom を作成しました。ここにあります:

したがって、オブジェクトへの参照を取得できる唯一の方法は、リフレクションを使用して、Reference クラスにある参照対象フィールドから if を取得することです。これは、クリーンアップ メソッドから MyClass.close() を呼び出す唯一の方法ですか?

PSここにすべてのコードを投稿したわけではありませんが、テストしたところすべて正常に動作します。ReferenceQueue は PhantomReferences で満たされているので、それらを 1 つずつ取得してクリーンアップ メソッドを呼び出すことができます。しかし、リフレクションを使用せずに上記の問題を解決する方法がわかりません。