HashMap com valores fracos

Estou implementando um cache para objetos armazenados persistentemente. A ideia é:

MétodogetObjectFromPersistence(long id); ///Takes about 3 secondsMétodogetObjectFromCache(long id) //Instantly

E tem um método:getObject(long id) com o seguinte pseudocódigo:

synchronized(this){
    CustomObject result= getObjectFromCache(id)
    if (result==null){
       result=getObjectFromPersistence(id);
       addToCache(result);
    }
    return result;
}

Mas eu preciso permitir que o CustomObject seja coletado pelo coletor de lixo. Até agora eu estava usando umHashMap<Long,WeakReference<CustomObject> para a implementação. O problema é que, com o tempo, o HashMap fica cheio de vazioWeakReferences.

Eu verifiqueiWeakHashMap mas lá as chaves são fracas (e os valores ainda são fortes referências), então ter os longs com WeakReferences não tem sentido.

Qual é a melhor solução para resolver este problema? Existe algum "WeakHashMap inverso" ou algo similar?

obrigado

questionAnswers(7)

yourAnswerToTheQuestion