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"?

Foi útil?

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.

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