Domanda

In Java, se creo un Hashtable<K, V> e inserisco N elementi in esso, quanta memoria occuperà? Se dipende dall'implementazione, quale sarebbe una buona & Quot; indovina & Quot ;?

È stato utile?

Soluzione

Modifica; Oh cavolo, sono un idiota, ho dato informazioni per HashMap, non per HashTable. Tuttavia, dopo aver verificato, le implementazioni sono identiche per scopi di memoria.

Questo dipende dall'impostazione della memoria interna della VM (imballaggio di elementi, puntatori a 32 o 64 bit e allineamento / dimensioni delle parole) e non è specificato da Java.

Informazioni di base sulla stima dell'utilizzo della memoria sono disponibili qui .

Puoi stimarlo in questo modo:

  • Nelle macchine virtuali a 32 bit, un puntatore è di 4 byte, nelle macchine virtuali a 64 bit, è di 8 byte.
  • Il sovraccarico dell'oggetto è 8 byte di memoria (per un oggetto vuoto, che non contiene nulla)
  • Gli oggetti sono riempiti con una dimensione che è un multiplo di 8 byte (ugh).
  • Esiste un overhead piccolo e costante per ogni hashmap: un float, 3 ints, più overhead dell'oggetto.
  • Esiste un array di slot, alcuni dei quali avranno voci, alcuni dei quali saranno riservati a quelli nuovi. Il rapporto tra slot riempiti e slot totali NON È PIÙ DEL fattore di carico specificato nel costruttore.
  • L'array di slot richiede un overhead di oggetto, più un int per dimensione, più un puntatore per ogni slot, per indicare l'oggetto memorizzato.
  • Il numero di slot è generalmente da 1,3 a 2 volte superiore al numero di mapping memorizzati, con un fattore di carico predefinito di 0,75, ma potrebbe essere inferiore a questo, a seconda delle collisioni di hash.
  • Ogni mapping memorizzato richiede un oggetto entry. Ciò richiede un overhead di oggetto, 3 puntatori, oltre alla chiave memorizzata e agli oggetti valore, oltre a un numero intero.

Quindi, mettendolo insieme (per Sun HotSpot JVM a 32/64 bit): HashMap richiede 24 byte (se stesso, campi primitivi) + 12 byte (costante di array di slot) + 4 o 8 byte per slot + 24/40 byte per voce + dimensione oggetto chiave + valore dimensione oggetto + riempimento di ciascun oggetto su più di 8 byte

OPPURE, all'incirca (nella maggior parte delle impostazioni predefinite, non garantite per essere precisi):

  • Su JVM a 32 bit: 36 byte + 32 byte / mappatura + chiavi & amp; I valori
  • Su JVM a 64 bit: 36 byte + 56 byte / mappatura + chiavi & amp; I valori

Nota: è necessario un maggiore controllo, potrebbero essere necessari 12 byte per l'overhead degli oggetti nella VM a 64 bit. Non sono sicuro dei null - i puntatori per i null possono essere compressi in qualche modo.

Altri suggerimenti

È difficile stimare. Vorrei leggere prima questo: http://www.codeinstructions.com/2008/12/ java-oggetti-memoria-structure.html

Usa gli strumenti sunjdk per capire le dimensioni di K, V e

jmap -histo [pid]

num #instances #bytes nome classe

1: 126170 19671768 MyKClass

2: 126170 14392544 MyVClass

3: 1 200000 MyHashtable

Inoltre potresti voler usare HashMap invece di Hashtable se non hai bisogno di sincronizzazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top