2

私はJavaでシステムを設計しようとしており、ディスクからロードされた画像やオーディオファイルなどのリソースを追跡し、参照がない場合はそれらをアンロードできます。

C ++では、削除演算子をオーバーライドして、参照をデクリメントすることができました。ただし、Javaは、参照がない場合にオブジェクトを破棄する自動ガベージコレクションと連携します。

リソースマネージャーですべてのリソースを追跡しているため、オブジェクトへの参照がnullになることはありません。したがって、リソースが不要な場合、リソースがアンロードされることはありません。

オブジェクトからの参照がないときにオブジェクトを削除すると同時に、オブジェクトを追跡する方法はありますか?

デコンストラクターは安全ではないので、それも選択肢ではないと聞きました

4

3 に答える 3

3

WeakHashMap などのリソース マネージャーで WeakRefence を使用します。

ここで、WeakReferences (および Softreference などの他の参照) の適切な説明を見つけることができます: http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

簡単に言うと、弱い参照は、オブジェクトを強制的にメモリに保持しない参照です。オブジェクトへの強い参照がなくても、resourcemanager に弱い参照がある場合、そのオブジェクトはガベージ コレクションの対象となり、ガベージ コレクターによって削除される可能性があります。

于 2012-05-07T10:59:28.293 に答える
1

Java 7 には、リソースのクローズを特定のプログラム スコープのクローズに結び付ける、スコープ ベースの自動リソース管理を許可するきちんとした方法があります。ただし、私が理解しているように、Javaオブジェクト破壊の非決定論的性質により、オブジェクトベースのリソース管理(あなたが説明しているように見えます)は不可能です。

リソースが開かれた元のスコープ外でリソースの閉鎖を行う必要がある、より複雑なシナリオ (たとえば、別のスレッドで、またはイベントを受信した後) では、手動で閉鎖を実行する必要があります。残念ながら参照カウントの実装 (C++ に共通) は不可能です。

于 2012-05-07T11:36:47.310 に答える
1

パッケージ内のメソッドdisposeのように、リソースのユーザーがリソースを使い終わったときに、リソースを手動で使用するように強制できます。close()java.io

そのようなメソッド内disposeでは、カウンターをデクリメントすることができ、ゼロに到達すると、基礎となるリソースを明示的に解放します。

于 2012-05-07T11:03:30.960 に答える