2011-01-19 11 views
5

Ho un ArrayList<Obj> e desidero sapere quanta memoria sta usando.Qual è la dimensione della memoria di un ArrayList in Java

Il Obj è variante così, non è così semplice come moltiplicare il numero di elementi nella matrice per la dimensione di un oggetto.

+3

vedere http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object –

risposta

3

È possibile forza bruta calcolarlo se si conosce la distribuzione dei contenuti degli oggetti.

Tuttavia, il metodo più preciso che riesco a pensare è quello di guardarlo in un profiler. Ci sono strumenti gratuiti là fuori, alcuni che vengono con il JDK. Tuttavia, il miglior strumento che ho usato è Yourkit. Ciò non significa che sia l'unica soluzione, solo la mia preferita.

+0

jmap è sufficiente e gratuito :) – bestsss

18

È la capacità di java.util.ArrayList moltiplicata per la dimensione di riferimento (4 bytes on 32bit, 8bytes on 64bit) + [Object header + one int and one references].

La capacità è diverso (always >=) rispetto alla dimensione, ma si vuole fare 'em uguale, chiamare trimToSize()

Tecnicamente parlando il ArrayList ha un Object[] dove memorizza i dati.

3

Questo è ciò che un profiler di memoria è per. Ti dirà per la tua piattaforma. La dimensione minima per un ArrayList vuoto è 64 byte. È molto probabile che non sia necessario saperlo a meno che non si disponga di 100K elementi o più.

0

Il modo in cui un ArrayList funziona è che contiene semplicemente un array di una certa dimensione (che può essere specificata nel costruttore, credo che 10 sia l'impostazione predefinita?). Ogni volta che il numero di elementi diventa troppo grande per l'array interno, la dimensione dell'array interno viene raddoppiata. Quindi è necessario moltiplicare la dimensione dell'oggetto in base alla dimensione dell'array interno.

3

Potrebbe essere necessario utilizzare uno profiler come quello disponibile in Netbeans che mostrerà il consumo di memoria del nostro programma e può fornire alcuni dettagli su ciascun oggetto.

1

La risposta è, dipende da come si misura. Se mi chiedessi la dimensione di un ArrayList ti darei le dimensioni ridotte. Vale a dire, un ArrayList consiste in una matrice di riferimenti e un intero che indica il numero di elementi contenuti. Se volevi sapere le dimensioni è semplicemente 4 + * array.length.

Se si desidera conoscere la dimensione di ArrayList e tutti gli elementi contenuti, ci sono alcuni analizzatori di heap che possono capirlo. Credo che YourKit sia uno di loro.

1

L'utilizzo di memoria java dipende dell'attuazione JVM. L'unico metodo reale per determinare l'utilizzo della memoria di un'istanza che conosco è quello di utilizzare un agente Java 5 instrumentation. C'è un po 'di tutorial per farlo.

Problemi correlati