2010-10-21 24 views
11

Sto lavorando per calcolare la dimensione [memoria utilizzata] di un oggetto java [hashmap]. Contiene elementi di diversi tipi di dati [in fase di esecuzione] quindi [non-di-elem * size-of-element] non è un buon approccio. Il codice adesso lo fa per serie diCalcolo della dimensione in byte dell'oggetto Java

if (x) 
    do something 
else if (primitives) 
    lookup size and calculate 

Tuttavia questo processo è un maiale CPU ed inefficiente.

Sto pensando di seguire 2 approcci invece:

  1. serializzare l'oggetto in un buffer e ottenere le dimensioni.
  2. Guardate in java.lang.instrument per ottenere la dimensione

Cerco anyones esperienza con questi approcci per prestazioni, efficienza, scalabilità ecc o se conoscete un modo migliore.

P.S: Questa è un'utilità di background che sto costruendo in modo che la dimensione non sia eccessivamente accurata sebbene debba essere corretta. Quindi io sono disposto a scambiare la precisione per le prestazioni

non mi interessa nel profondo dimensioni [le dimensioni degli oggetti che sono riferiti da questo oggetto non sarà calcolato.]

Cerco un confronto delle prestazioni e capire come funziona internamente getObjectSize() ..così che non messup qualcos'altro per migliorare le prestazioni

Grazie

+0

Cosa * esattamente * intendi per dimensione? Quantità di memoria occupata? Numero di elementi contenuti? –

+0

in base alle dimensioni, intendo la quantità di memoria utilizzata. Modifica per rispecchiare quella domanda – codeObserver

+1

Più o meno identica: http://stackoverflow.com/questions/757300/programatically-calculate-memory-occupied-by-a-java- object-including-objects-it-r – andersoj

risposta

4

Uso getObjectSize() metodo del pacchetto di strumenti.

Cercare here per i dettagli di implementazione:

+0

thnx .. Sto cercando un confronto delle prestazioni e la comprensione di come getObjectSize() funziona internamente .. così che io non messup di qualcos'altro per migliorare le prestazioni // anche se penso che getObjectSize è il mio migliore opzione. – codeObserver

2

Il formato serializzato non è sicuramente la strada da percorrere, per due motivi:

  • Nella serializzazione Java Standard non ci può essere un bel po 'di spese generali, che avrebbe aggiungere alla dimensione.
  • Non sarebbe più veloce dell'utilizzo del metodo getObjectSize() che possiamo presumere eseguirà un'iterazione su tutti i riferimenti e utilizzerà una sorta di ricerca per determinare la dimensione dei valori/riferimenti primitivi di un oggetto.

Se hai bisogno di prestazioni migliori, questo dipenderà dalla distribuzione dei tuoi oggetti. Una possibilità sarebbe quella di fare un campionamento casuale dei valori nella mappa, determinare una media e calcolare una stima da questo valore.

Per consigli su come cercare un valore casuale in una mappa di hash, vedere questo question.

+0

Thnx..Il campionamento casuale potrebbe essere molto impreciso poiché il valore nella mappa di hash può variare notevolmente in termini di dimensioni. – codeObserver

2

Potresti essere interessato a un articolo che ho scritto qualche tempo fa su how to calculate the memory usage of a Java object. È chiaramente destinato principalmente all'hotspot a 32 bit, sebbene in gran parte si applichi essenzialmente ad altri ambienti.

È anche possibile scaricare un semplice agent for measuring Java object size dallo stesso sito che richiederà un po 'di fatica per farlo e dovrebbe funzionare in ambienti a 64 bit.

Nota come altri ho pensato che la forma serializzata di un oggetto non è uguale alla sua forma in memoria, quindi l'uso della serializzazione non è adatto se si desidera misurare accuratamente l'impronta di memoria.

Problemi correlati