2012-05-07 5 views
2

私はJavaでシステムを設計しようとしています。ここで、ディスクから読み込まれたイメージやオーディオファイルなどのリソースを追跡し、参照がない場合はアンロードします。リソースを追跡し、必要ではない間にアンロード

C++では、削除演算子をオーバーライドできるので、参照を減らすことができます。 しかし、Javaは自動的なガーベジコレクションで動作し、オブジェクトが参照を持たないときにオブジェクトを破棄します。

私がResourceManagerにすべてのリソースを追跡しているので、オブジェクトへの参照は、それらが必要されていない場合ので、リソースがアンロードされることはありません、nullになることはありません。

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

私はそれがまた、オプション

+0

マネージドGCランゲージは、非決定論的な破壊を持っているので、オブジェクトの破棄にリソースのクローズを実際に結びつけることはできません。それは私がJava/C#プログラミング時にC++から最も逃していることの一つです。 – Benj

+0

自動的な方法はありません。あなたはrefcountingのいくつかの並べ替えを実装する必要があります。リソースを使用するすべてのものは、開始時に 'acquire'を呼び出し、最後に' release'を呼び出さなければなりません。 –

答えて

3

あなたのResourceManagerに使用WeakRefence、例えばませんので、デコンストラクタは安全ではありません聞いたことがありますWeakHashMapです。

現在地WeakReferences(および例えばSoftreferenceその他の参考文献)の良い説明を見つけることができます:http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

シンプルに言った: 弱参照は、メモリ内に滞在するオブジェクトを強制的にしない基準です。オブジェクトへの強い参照がなくても、あなたのresourcemanagerにまだ弱い参照がある場合、オブジェクトはガベージコレクションの対象となり、ガベージコレクタによって削除されます。

+0

WeakRefは依然としてタイムリーな処分を解決していません。リソースの存続期間とオブジェクトの存続期間を結合し、リソースリークの扉を開きます。 –

+1

これは、たとえば、キャッシュの目的でオブジェクト参照を保持したいが、GCを防ぐことができない別の使用例です。 OPが説明するシナリオでのリソース管理には役立ちません。 – Benj

+1

@Pablo - 弱参照は、オブジェクトへの他の参照がある間にのみ使用できます(これらの参照がすべて消えた後は、WRはリソースを閉じるなどのために使用できません)。さらに、説明されているシナリオでは、GCが発生したときではなく、オブジェクトが最後の参照を失ってから数日後に、リソースを適時閉鎖する必要があります。 – Benj

1

あなたは、手動でそれらはそれらを終了したとき、彼らが使用するリソースをdisposeするjava.ioパッケージでclose()方法のようなものを、リソースのユーザーを強制することができます。

スチームdisposeの方法では、カウンターを減らすことができます。ゼロがreacheadの場合は、基になるリソースを明示的に解放します。

1

Java 7には、リソースのクローズをpaticularプログラムスコープのクローズに結びつけるスコープベースのautomatic resource managementがあります。しかし、私が理解しているように、Javaオブジェクトの破壊の非決定論的性質のため、オブジェクトベースのリソース管理(記述していると思われる)は不可能です。

リソースが開かれた元のスコープの外で(たとえば、別のスレッドで、またはイベントを受け取った後に)リソースクロージャが発生する必要がある、より複雑なシナリオでは、手動で終了する必要があります。リファレンスカウントの実装(C++に共通)は悲しいことには不可能です。

関連する問題