私は 2 年間 Java 開発者をしています。
しかし、コードに WeakReference を書いたことはありません。WeakReference を使用してアプリケーション、特に Android アプリケーションをより効率的にするにはどうすればよいですか?
私は 2 年間 Java 開発者をしています。
しかし、コードに WeakReference を書いたことはありません。WeakReference を使用してアプリケーション、特に Android アプリケーションをより効率的にするにはどうすればよいですか?
Android でを使用することWeakReference
は、単純な古い Java で使用することと何ら変わりはありません。
オブジェクトへの参照が必要な場合はいつでも使用することを検討する必要がありますが、ガベージ コレクターからオブジェクトを保護するためにその参照は必要ありません。古典的な例は、メモリ使用量が高くなりすぎたときにガベージ コレクションを実行するキャッシュです (多くの場合、 で実装されますWeakHashMap
)。
SoftReference
などもぜひチェックしてみてくださいPhantomReference
。
編集: Tom は、WeakHashMap
. 問題を説明している記事は次のとおりです: WeakHashMap はキャッシュではありません!
Tom の言うとおり、キャッシングが原因で Netbeans のパフォーマンスが低下するという苦情WeakHashMap
がありました。
WeakHashMap
でキャッシュを実装し、それを で実装された独自の手巻きキャッシュと比較することは、良い学習体験になると思いますSoftReference
。Apache JCSのようなサードパーティのライブラリを使用する方が理にかなっているからです。
「正規化された」マッピングは、問題のオブジェクトの 1 つのインスタンスをメモリに保持し、他のすべてのインスタンスがポインタまたはそのようなメカニズムを介してその特定のインスタンスを検索する場所です。これは、弱い参照が役立つ場所です。簡単に言うと、WeakReferenceオブジェクトを使用して、システム内のオブジェクトへのポインターを作成できますが、それらのオブジェクトがスコープ外に渡された後も、ガベージ コレクターによってそれらのオブジェクトを再利用できます。たとえば、次のようなコードがあるとします。
class Registry {
private Set registeredObjects = new HashSet();
public void register(Object object) {
registeredObjects.add( object );
}
}
のセットに保存されているオブジェクトへの参照があるため、登録したオブジェクトは GC によって再利用されることはありませんregisteredObjects
。一方、私がこれを行うと:
class Registry {
private Set registeredObjects = new HashSet();
public void register(Object object) {
registeredObjects.add( new WeakReference(object) );
}
}
その後、GC が Set 内のオブジェクトを再利用したい場合、それが可能になります。この手法は、キャッシング、カタログ化などに使用できます。GC とキャッシングに関するより詳細な説明については、以下を参照してください。