PDA

View Full Version : [Java] Come determinare la dimensione a run time di un istanza di classe?


shang84
24-11-2005, 10:21
Ciao a tutti,
mi chiedevo com'è possibile determinare la dimensione di una singola istanza di classe in java a run-time?

Grazie

FedeX_65246X
24-11-2005, 23:31
Ciao a tutti,
mi chiedevo com'è possibile determinare la dimensione di una singola istanza di classe in java a run-time?

Grazie

Dai un'occhiata a queste due classi:

java.io.ObjectOutputStream
java.io.ByteArrayOutputStream

sottovento
25-11-2005, 12:54
Da quel che ho capito (ti prego di scusarmi se ho capito in maniera errata), vorresti sapere l'occupazione (in byte) di una classe in memoria. O meglio, dei dati della stessa. Giusto?
Il suggerimento dato da FedeX_65246X e' utile in alcune situazioni: se la classe e' serializzabile, la potresti serializzare e mettere in uno stream. A questo punto puoi vedere quanto occupa (in byte la classe).

Ovviamente, per poter usare questa soluzione, la classe deve essere serializzabile. Inoltre, quando si serializza un oggetto, vengono salvati anche informazioni aggiuntive sui tipi, in modo da poter ripristinare l'oggetto dallo stream. Inoltre ci saranno altre occupazioni legate alla classe, visto che i metodi sono, per default, "virtuali" (nel senso del C++). Immagino pero' che questo non ti interessi.

Nel caso che il suggerimento postato non faccia al tuo caso, prova a dare qualche info in piu', in modo da pensare ad un "escamotage"...

Ciao
sottovento

FedeX_65246X
25-11-2005, 17:27
Ovviamente, per poter usare questa soluzione, la classe deve essere serializzabile. Inoltre, quando si serializza un oggetto, vengono salvati anche informazioni aggiuntive sui tipi, in modo da poter ripristinare l'oggetto dallo stream.


Penso tu abbia ragione, in effetti non è la procedura più indicata e/o precisa.
Forse sfruttando la reflection qualcosa si riesce a fare :boh:

shang84
25-11-2005, 18:17
Da quel che ho capito (ti prego di scusarmi se ho capito in maniera errata), vorresti sapere l'occupazione (in byte) di una classe in memoria. O meglio, dei dati della stessa. Giusto?
Il suggerimento dato da FedeX_65246X e' utile in alcune situazioni: se la classe e' serializzabile, la potresti serializzare e mettere in uno stream. A questo punto puoi vedere quanto occupa (in byte la classe).

Ovviamente, per poter usare questa soluzione, la classe deve essere serializzabile. Inoltre, quando si serializza un oggetto, vengono salvati anche informazioni aggiuntive sui tipi, in modo da poter ripristinare l'oggetto dallo stream. Inoltre ci saranno altre occupazioni legate alla classe, visto che i metodi sono, per default, "virtuali" (nel senso del C++). Immagino pero' che questo non ti interessi.

Nel caso che il suggerimento postato non faccia al tuo caso, prova a dare qualche info in piu', in modo da pensare ad un "escamotage"...

Ciao
sottovento


effettivamente non tutte le classi di cui volgio conoscere la dimensione sono serializzabili... mi interesserebbe appunto sapere, quanto occupa ogni singola classe in modo da gestire al meglio la memoria in heap del programma in esecuizone e da fare dei conti in modo da vedere se le modifiche (mettere a null gli oggetti che non mi servono +, usare i file per memorizzare liste troppo grandi di oggetti senza tenerle in memoria.. etc...etc..) che sto facendo hanno senso o no per ridurre la memoria allocata..

thnks

theClimber
25-11-2005, 23:00
Ti serve un profiler !

Dai un occhio a questa pagina, c'e' una lista di alternative open source:

http://www.manageability.org/blog/stuff/open-source-profilers-for-java/view

ciao

^TiGeRShArK^
26-11-2005, 01:08
prova a dare un okkiata a java.lang.management.MemoryUsage credo ke faccia al caso tuo...
non ti da informazioni su una classe specifica se non sbaglio, ma ti dice l'uso della memoria della JVM ;)

smartz
26-11-2005, 09:18
concordo sulla necessita di un profiler!!!!

in realta a runtime come fa una JVM a sapere l'occupazione di un oggetto?

e poi..... intendi l'occupazione "deep" (l'oggetto + tutti gli oggetti referenziati) o un "shallow" (solo l'oggetto).

beh solo l'oggetto e' semplice, basta sommare la dimensione di ogni singola variabile d'istanza..... quella "deep" un po piu caotica

prova a guardare
www.yourkit.com

sarebbe commerciale ma puoi provare una licenza temporanea......

questo ti fa uno snapshot della memoria utilizzata e la ppuoi "navigare" per classi, guardando l'utilizzo di memoria "deep" e "shallow" di ogni classe :)

ciao ciao

shang84
26-11-2005, 10:43
thnks!