Quanta memória faz um uso Hashtable?
-
07-07-2019 - |
Pergunta
Em Java, se eu criar um Hashtable<K, V>
e colocar N elementos nele, quanta memória será que vai ocupar? Se é dependente de implementação, o que seria uma boa "palpite"?
Solução
Editar; Oh Nossa, eu sou um idiota, eu dei informações para HashMap, não HashTable. No entanto, após a verificação, as implementações são idênticas para fins de memória.
Esta é dependente de configuração memória interna de sua VM (embalagem de itens, 32 bits ou 64 bits ponteiros e palavra de alinhamento / tamanho) e não é especificado por java.
Informações básicas sobre a estimativa uso de memória pode ser encontrada aqui .
Você pode estimar-lo assim:
- em 32 bits VMs, um ponteiro é de 4 bytes, 64 bits em máquinas virtuais, que é de 8 bytes.
- objecto sobrecarga é de 8 bytes de memória (para um objeto vazio, contendo nada)
- Objectos são preenchidos para um tamanho que é um múltiplo de 8 bytes (urg).
- Há uma pequena sobrecarga, constante para cada hashmap:. Um flutuador, 3 ints, além de sobrecarga objecto
- Existe uma variedade de slots, alguns dos quais terão entradas, alguns dos quais serão reservados para os novos. A proporção de ranhuras cheio até ranhuras no total é mais do que o factor de carga especificada no construtor.
- A matriz de ranhura exige uma sobrecarga objecto, mais um int por tamanho, além de um ponteiro para cada ranhura, para indicar o objecto armazenado.
- O número de ranhuras é geralmente de 1,3 a 2 vezes mais do que o número de mapeamentos armazenados, com um factor de carga padrão de 0,75, mas podem ser menos do que esta, dependendo colisões de hash.
- Cada mapeamento armazenado requer um objeto de entrada. Isso requer uma sobrecarga objeto, 3 ponteiros, mais os objetos-chave e de valor armazenado, além de um número inteiro.
Então, colocá-lo juntos (para 32/64 bit Sun HotSpot JVM): HashMap precisa de 24 bytes (si, campos primtive) + 12 bytes (ranhura matriz constantes) + 4 ou 8 bytes por ranhura + 24/40 bytes por entrada + tamanho chave objeto tamanho objeto + + valor de preenchimento de cada objecto múltiplo de 8 bytes
OR, aproximadamente (na maioria das configurações padrão, não é garantida para ser preciso):
- Em 32 bits JVM: 36 bytes + 32 bytes / mapeamento + chaves e valores
-
em 64 bits JVM: 36 bytes + 56 bytes / mapeamento de teclas + e valores
Nota: Este necessidades mais verificação, ele pode precisar de 12 bytes para cima objeto de 64 bits VM. Eu não tenho certeza sobre nulos - ponteiros para valores nulos podem ser comprimidos de alguma forma.
Outras dicas
É difícil estimar. Eu lia este primeiro: http://www.codeinstructions.com/2008/12/ java-objetos-memory-structure.html
Basta usar as ferramentas sunjdk para descobrir o tamanho de K, V e
jmap -histo [pid]
num #instances #bytes nome da classe
1: 126170 19671768 MyKClass
2: 126170 14392544 MyVClass
3: 1 200000 MyHashtable
Além disso, você pode querer usar HashMap em vez de Hashtable se você não precisa de sincronização.