2009-05-14 14 views
4

JavaでソフトリファレンスベースのLinkedHashMapはありますか?いいえ、誰かに再利用可能なコードスニペットがありますか?私はそれを正しく参照することを約束します。ソフトリファレンスJavaでLinkedHashMap?

ありがとうございました。

+4

メモリに敏感なキャッシュでこれを行う予定がある場合は、利用可能なメモリが何かを規制する非常に悪い方法であることに注意してください。大ヒープ環境では、古くなったオブジェクトを非常に長い時間保持することができ、全体的な操作が遅くなります。時間とサイズベースのキャッシュははるかに優れています。また、これに興味があるかもしれません:http://www.kdgregory.com/index.php?page=java.refobj – kdgregory

答えて

3

ここで私が見たベストアイデアは、putがすべてWeakReferenceであるように、LinkedHashMapをラップすることです。

更新日:WeakHashMapのソースを参照して、すべてのことを処理する方法をWeakReferenceでも、ジェネリックでうまくいくのは固いです。

private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> 

私は他の実装のアイデアのための深さでthe sourceより多くを閲覧することをお勧め:ここではそれが使用するコアクラスの署名があります。

更新2:kdgregoryは彼のコメントで良い点を挙げています。私の提案は、Mapの参照がガベージコレクションから参照を保持しないようにすることです。死んだ参照を手動で削除する必要があります。

+3

参照が消えないので、これはうまくいきません。ただクリアされます。そしてあなたは死んだ参考資料でいっぱいの地図で終わるでしょう。 WeakHashMapコードを見ると、死んだ参照が遅れて削除されていることがわかります(私は参照キューを使用していると思います)。 – kdgregory

6

WeakHashMapは挿入順序を保持しません。したがって、LinkedHashMapを直接的に置き換えることはできません。さらに、のキーにアクセスできない場合にのみマップエントリが解放されます。あなたが探しているものではないかもしれません。

あなたが探しているものがメモリフレンドリーなキャッシュであれば、ここでは簡単に実装できます。

package be.citobi.oneshot; 

import java.lang.ref.SoftReference; 
import java.util.LinkedHashMap; 

public class SoftLinkedCache<K, V> 
{ 
    private static final long serialVersionUID = -4585400640420886743L; 

    private final LinkedHashMap<K, SoftReference<V>> map; 

    public SoftLinkedCache(final int cacheSize) 
    { 
     if (cacheSize < 1) 
      throw new IllegalArgumentException("cache size must be greater than 0"); 

     map = new LinkedHashMap<K, SoftReference<V>>() 
     { 
      private static final long serialVersionUID = 5857390063785416719L; 

      @Override 
      protected boolean removeEldestEntry(java.util.Map.Entry<K, SoftReference<V>> eldest) 
      { 
       return size() > cacheSize; 
      } 
     }; 
    } 

    public synchronized V put(K key, V value) 
    { 
     SoftReference<V> previousValueReference = map.put(key, new SoftReference<V>(value)); 
     return previousValueReference != null ? previousValueReference.get() : null; 
    } 

    public synchronized V get(K key) 
    { 
     SoftReference<V> valueReference = map.get(key); 
     return valueReference != null ? valueReference.get() : null; 
    } 
} 
2

this postをご覧ください。 SoftHashMapを実装する方法を示しています。

+2

Apache Shiroは既に(承認済みの)このメソッドの実装を持ち、Apache v2のライセンスを受けています。これはApache [Shiro] [1]でパッケージ化されています。ドキュメント[here] [2]とソースコード[here] [3]があります。 [1]:http://en.wikipedia.org/wiki/Apache_Shiro [2]:http://shiro.apache.org/static/1.1.0/apidocs/ [3]:のhttp: //shiro.apache.org/static/1.1.0/apidocs/src-html/org/apache/shiro/util/SoftHashMap.html – DallinDyer

関連する問題