問題タブ [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 - Soft-/Weak-/PhantomReferences が追跡対象オブジェクトへの参照を持つオブジェクトへの参照をクリアする理由
Soft
-、Weak
-、およびs のすべてのドキュメントPhantomReference
には、次のような行が含まれています (から引用PhantomReference
)。
その時点で、そのオブジェクトへのすべてのファントム参照と、そのオブジェクトに到達可能な他のファントム到達可能オブジェクトへのすべてのファントム参照がアトミックにクリアされます。
私を混乱させているのは、他のファントム到達可能オブジェクトに関する部分です。
私がそれを正しく理解していれば、これはこのケースを説明しています:
オブジェクト:
- あ
- B
参考文献:
->
: 強い参照-P->
: ファントム参照
B
そのため、何らかの理由で、ガベージ コレクターは、それがファントム リーチ可能であるとまだ判断していません。A
がファントム到達可能になり、ガベージ コレクターがこれを検出した場合、(上記のドキュメントによると) への参照もクリアする必要がありますB
。
ドキュメントでこれが必要な理由はありますか? 他のベンダーが JVM を開発した場合、これはむしろ負担になると思われます。
java - 登録されているオブジェクトへの参照を使用してクリーニング アクションを実行する方法
Java 9以降、ついにCleaner
. ただし、ドキュメントでは具体的に宣言されています:
各クリーナーは独立して動作し、保留中のクリーニング アクションを管理し、クリーナーが使用されなくなったときにスレッド化と終了を処理します。
オブジェクト参照と対応するクリーニング アクションを登録すると、Cleanable が返されます。最も効率的な使い方は、オブジェクトが閉じられたとき、または不要になったときに明示的に clean メソッドを呼び出すことです。
クリーニング アクションは、明示的にクリーニングされていない限り、オブジェクトがファントムに到達可能になったときに最大 1 回呼び出される Runnable です。
クリーニング アクションは、登録されているオブジェクトを参照してはならないことに注意してください。その場合、オブジェクトはファントム到達可能にならず、クリーニング アクションは自動的に呼び出されません。
残念ながら、これはまさに私が必要とするものです: 登録したいアクションは、オブジェクト自体を参照する必要があります (通常はメソッドを呼び出すだけです)。
これは Cleaner では不可能に見えるため、Phantom または弱い/ソフト参照を使用してそれを行う方法はありますか?
私はそれらを見てみましたが、かなり複雑に見えるので、真剣に掘り下げる前に、このようなことが可能かどうかを事前に知りたいと思います.
Ps: どうやら、Phantom 参照が事後分析で実行されるようになったようです