178

私は 2 年間 Java 開発者をしています。

しかし、コードに WeakReference を書いたことはありません。WeakReference を使用してアプリケーション、特に Android アプリケーションをより効率的にするにはどうすればよいですか?

4

4 に答える 4

235

Android でを使用することWeakReferenceは、単純な古い Java で使用することと何ら変わりはありません。

オブジェクトへの参照が必要な場合はいつでも使用することを検討する必要がありますが、ガベージ コレクターからオブジェクトを保護するためにその参照は必要ありません。古典的な例は、メモリ使用量が高くなりすぎたときにガベージ コレクションを実行するキャッシュです (多くの場合、 で実装されますWeakHashMap)。

SoftReferenceなどもぜひチェックしてみてくださいPhantomReference

編集: Tom は、WeakHashMap. 問題を説明している記事は次のとおりです: WeakHashMap はキャッシュではありません!

Tom の言うとおり、キャッシングが原因で Netbeans のパフォーマンスが低下するという苦情WeakHashMapがありました。

WeakHashMapでキャッシュを実装し、それを で実装された独自の手巻きキャッシュと比較することは、良い学習体験になると思いますSoftReferenceApache JCSのようなサードパーティのライブラリを使用する方が理にかなっているからです。

于 2010-07-14T03:37:45.733 に答える
9

「正規化された」マッピングは、問題のオブジェクトの 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 とキャッシングに関するより詳細な説明については、以下を参照してください。

参照:ガベージ コレクターと WeakReference

于 2016-11-17T09:32:52.263 に答える