Recentemente, stavo scrivendo una classe in cui ho scoperto che potevo ridurre il consumo di memoria delle istanze di ~ 10 byte/elemento, ma solo a costo di rendere il codice molto più complesso. Ciò ha aumentato le dimensioni del file compilato .class
di ~ 10 KB.Come si stima il consumo totale di memoria permgen di una classe?
Suppongo che la JVM debba caricare il file .class
in memoria, quindi queste modifiche non si pagherebbero da sole a meno che non fossero presenti almeno 1000 elementi. Ma questa aritmetica non funziona a meno che il 10KB extra nel file di classe sia il solo costo della maggiore complessità del codice.
suggerisce che c'è una buona quantità di memoria extra che viene consumata dalla classe nel permgen che non è solo basata sul file .class
- ad esempio, sospetto che un codice più complesso possa richiedere più memoria per i metadati di ottimizzazione .
Quindi, questa domanda ha due parti:
- Come posso misurare il consumo effettivo di memoria PermGen di una particolare classe? O in fase di esecuzione con alcuni strumenti o con strumenti di profilazione?
- C'è un modo per stimare il consumo della memoria di permgen della classe mentre scrivo? (Con some background knowledge, è possibile stimare il consumo di memoria di istanze di classe come li sta scrivendo; mi chiedo se siamo in grado di stimare il consumo di memoria PermGen della classe stessa.)
dettagli simili per la Dalvik VM sarebbe apprezzato, ma sono principalmente concentrato su OpenJDK e sulle altre JVM "mainstream".
Profiling potrebbe aiutare –
requisiti di memoria dipenderà anche dal fatto HotSpot lo compila. Il codice JITed ha il suo costo. –
@JesseWilson: questo è chiaramente vero, ma esiste un buon modo per stimare tale costo? È solo il consumo dell'assemblaggio grezzo, o ci sono molti libri contabili aggiuntivi? –