Pergunta

Eu sei que há um WeakHashMap em java.util, mas uma vez que utiliza WeakReferences para tudo, o que só é referenciado por este Map, objetos referenciados vai se perder no próximo ciclo de GC. Portanto, é quase inútil se você deseja armazenar em cache dados aleatórios, o que é muito provável que seja solicitada novamente sem ser Hard-ligada o resto do tempo. A melhor solução seria um mapa, que usa SoftReferences vez, mas eu não encontrei um no RT Pacote Java.

Foi útil?

Solução

Editar (Agosto de 2012):

Acontece que, actualmente, a melhor solução é provavelmente aulas Cache Goiaba 13.0 do, explicou em Wiki de goiaba - que é o que eu vou usar. Ele até suporta a construção de uma SoftHashMap (veja CacheBuilder.newBuilder().softKeys()), mas provavelmente não é o que você quer, como Java especialista Jeremy Manson explica (abaixo você encontrará o link).


Não que eu conheço (Nov. 2008), mas você tipo encontrar alguma implementação de SoftHashMap na rede.

Como este: SoftHashMap ou esta .


Editar (Nov. 2009)
Como Matthias menciona nos comentários, o Google Guava MapMaker faz uso SoftReferences:

Um construtor ConcurrentMap, fornecendo qualquer combinação destas características:

  • moles ou fracos chaves,
  • moles ou fracos valores,
  • expiração programável e
  • computação sob demanda de valores.

Conforme mencionado na esta discussão , outra JSR166y candidato:

jsr166y.ConcurrentReferenceHashMap

Ele fornece um mapa alternativo concorrente referência à implementação do Google (que se baseia em uma discussão de fundo para entradas despejar)


Editar (agosto de 2012)

A implementação do Google usa uma discussão de fundo apenas quando expiração programável de entradas é solicitada. Em particular, ela simplesmente usa java.util.Timer, que não é tão intrusiva como tendo uma discussão de fundo separado.

Jeremy Manson recomenda, para qualquer cache, usando esse recurso para evitar os perigos de SoftReference: http://jeremymanson.blogspot.de/2009/ 07 / how-hotspot-decide-se clear_07.html

Há uma outra implementação de Apache Commons , ou seja, org.apache.commons.collections.map.ReferenceMap ; ele não suporta a remoção cronometrado, mas suporta escolher se as chaves devem ser comparados por identidade ou por igualdade. Além disso, esta implementação não é concorrente -. Ele pode ser feito sincronizado, mas que as obras menos bem no total de acessos de vários segmentos

Outras dicas

Estou familiarizado com duas bibliotecas que oferecem uma implementação SoftHashMap:

  1. Apache Commons : org.apache.commons.collections.map.ReferenceMap

  2. Google Collections : com.google.common.collect.ReferenceMap

Há um exemplo de implementação no 98 assunto de especialistas java boletim

Shiro vem com um SoftHashMap projetados para armazenamento em cache. Sua base no artigo publicado por JB acima e licenciada sob Apache v2. Você pode encontrar a documentação aqui eo código-fonte aqui .

Você já pensou em usar um LRUMap em vez de um HashMap mole? Você ganha mais controle sobre o que fica armazenado (ou, pelo menos, quanto).

Se você quiser implementar um cache softreferences são definitivamente uma idéia melhor do que referências fracas, mas põe sua política de remoção de cache inteiro nas mãos do coletor de lixo. que provavelmente não é o que você quer.

Se a política de remoção de cache é importante você está indo para necessidade de fazê-lo em seus próprios provavelmente usando referências regulares. No entanto, você vai ter de decidir quando para ejetar itens e que a ejecção. Se você quiser apenas para as coisas perdem quando você está funcionando fora do espaço de pilha você pode consultar espaço de pilha disponível via:

Runtime.getRuntime().getFreeMemory();

Então uma vez que a memória livre cai abaixo de um certo valor que você pode começar quer deixar cair itens. Ou você poderia apenas implementar um tamanho máximo para o cache e usar isso para decidir quando para soltar as coisas.

aqui está um LRU de cache i concebido com o (1) de inserção, deleção e pesquisa de tempo, que tem um número máximo de elementos configurável. Se você quiser um cache isso vai ser um melhor imho solução do que um SoftHashMap.

Os softreferences são uma ótima maneira de criar um cache growable. Portanto, a solução ideal seria a utilização de um SoftHashMap juntamente com um cache de tamanho fixo regular. tem todas as inserções em movimento de cache em ambos o cache fixo eo mapa de hash macio, em seguida, a referência algo apenas ver se o seu na hashmap suave (e atualizar o tempo de referência no cache). Desta forma, todos os seus itens mais importantes (de acordo com sua política escolhida LRU, MFU, ...) nunca será removida porque são difíceis referenciado no cache, mas você também vai segurar mais coisas (sem controle de políticas), contanto como não há memória suficiente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top