Domanda

Vorrei chiedere di memoria Overhead in java, Ho un grande ArrayList (61,770 articoli), e cercando di calcolare la quantità di memoria occupata da ogni elemento (contando l'oggetto e la sua entrata ArrayList), profilando l'applicazione io ottenere che, dopo tutti i dati viene caricato, l'heap prende ~ 25Mb. quando l'ArrayList ha solo 2 elementi mucchio prende ~ 1 MB, quindi circa:

(24 * 1024 * 1024) / 61.768 = 407 byte.

tuttavia , quando conto campi della ciascun oggetto, ottengo 148 byte (escluso l'ArrayList, e assumendo int = 4, float = 4, riferimento = 4), sono curioso per sapere dove ha fatto tutti quei byte in più è venuto da ...

Posso immaginare che, dal momento che gli oggetti negozio nel ArrayList stanno implementando un'interfaccia, immagazzinano valori extra, forse i negozi VM un puntatore a funzione 4byte per ogni metodo implementato? l'interfaccia attuano ha 20 funzioni di modo che è 80 più byte, per 228 byte, non ancora vicino ai 400 byte misurata.

tutto l'aiuto sarebbe apprezzato.


wow, grazie per tutte le grandi risposte.

@Bolo:. Grazie per il link, con questa classe misuro ~ 350 bytes per oggetto in modo che posso almeno confermare l'origine della grande utilizzo della memoria

A @Yuval: grazie per quella presentazione, una preziosa fonte di informazioni

.

@Ukko:. Punto notato

@Jayan:. In questo momento NetBeans Profiler mi sta dando errori quando si tenta di eseguire il dump del mucchio, cercherà poi di nuovo

È stato utile?

Soluzione

Questi risultati non sono sorprendenti. La JVM aggiunge enormi quantità di overhead per ogni oggetto.

A proposito di raddoppiare le dimensioni previsto per un singolo oggetto, a causa di sovraccarico della memoria JVM, non è raro.

Questa presentazione ha un meraviglioso, in modo approfondito, la spiegazione e una panoramica di utilizzo della memoria varia struttura di dati in Java.

Altri suggerimenti

Un ArrayList ist in gran parte maggiore del numero di elementi. Uso getCapacity() per ottenere la dimensione corrente dell'array sottostante.

Un grosso problema con il vostro approccio è l'interazione con il garbage collector. Rende in pratica qualsiasi test come da lei proposto totalmente opaco dall'esterno.

Come un esperimento mentale, se si voleva fare questo si dovrebbe

  1. fuoco la vostra JVM e fare un paio di GC globali per ottenere tutta la spazzatura fuori
  2. Misurare la dimensione heap e la nozione di quantità di spazio libero che ha di Java.
  3. Esegui il test
  4. GC un paio di volte
  5. Ripristina le misurazioni da Passo # 2

Dopo tutto questo e un po 'di matematica si sarà più vicino, ma ancora non è giusto. L'unica vera soluzione è quella di chiedere in realtà l'attuazione, come altri hanno scritto. O una figura fuori dalla conoscenza della realizzazione.

Memoria consumato da ArrayList è un po 'vago.

Fate un heap dump del processo in fase appropriata - dopo che i valori sono completamente assegnati. Quindi utilizzare strumenti come analizzatore di memoria (da Eclipse).

Si riempie trovare poco profondo e mantenuto mucchio dimensioni.

Come nota a margine, dal momento che si sa esattamente quanti oggetti sarà nel tuo ArrayList, perché non basta utilizzare un array []? Il numero di oggetti in là cambiamento?

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