2012-01-09 13 views
6

La mia applicazione utilizza molta più memoria di quanto suppongo utilizzi e sto cercando di capire quale classe utilizza una grande quantità di memoria e forse non rilasciandolo.Campionatore di memoria Java VisualVM: come ottenere le dimensioni di una classe specifica

Sto usando VisualVM e nel campionatore di memoria posso vedere che la maggior parte della memoria è speso per Char, Stringhe e Byte, tutte le mie classi usano stringhe, ma come sapete VisualVM mostra TUTTI i caratteri e le stringhe nel sistema (tutti i caratteri sono identici alle stringhe che rende difficile capire chi li trattiene), perché ho capito che la dimensione delle altre classi che contengono queste stringhe è calcolata senza le stringhe.

Come posso vedere in questo strumento chi sono le classi "reali" più grandi - quelle che contengono tutte queste stringhe? (preferibilmente se riesco a passare da queste classi alle loro stringhe e non viceversa) Ho cercato di usare la "radice del GC più vicino" nell'heapDump ma ci sono circa 4.000.000 di stringhe quindi la possibilità di trovare la "problematica" "quelli è molto piccolo ...

Grazie !!!

+0

Penso che non si possa dire con esattezza quale classe utilizza quanta memoria. Se stai istanziando l'oggetto di un'altra classe in una classe diversa, come faresti a riguardo? Anche a mia conoscenza non è possibile ottenere un utilizzo meomory basato su classi. – Johnydep

risposta

2

Se si esegue un dump dell'heap, è possibile trovare i 20 oggetti più grandi (compreso tutto lo spazio a cui fa riferimento). Per altro, ti consiglio di usare la console OQL che è molto potente.

In sostanza, si sta cercando il seguente:

Lot of String's taking up 20Mb 
    --- kept alive by ---> 
HashSet#28839 
    --- kept alive by ---> 
MyOwnClass#88293 

vi propongo si prende una stringa casuale, trovare la sua referrees e analizzare questo fino a scoprire un possibile sospetto. Una volta che hai questo sospetto, puoi fare una query OQL usando http://visualvm.java.net/oqlhelp.html#rsizeof per scoprire la dimensione totale di questi oggetti.

+0

Grazie! Ci proverò ora, spero di trovare qualcosa usando questo metodo. – aye

+0

Ciao, sai come posso trovare una grande istanza specifica? Vedo solo le 4.000.000 stringhe che sono le più grandi ma non riesco a vedere le istanze specifiche più grandi. – aye

+0

Si dispone del dump dell'heap in cui la vista classi specifica String con il maggior numero di byte [%]. Fai doppio clic su questo, che ti porta alla vista Istanze. Qui puoi selezionare un'istanza specifica e seguire i riferimenti nel riquadro inferiore. – parasietje

2

Effettuare un dump dell'archivio, aprirlo con MAT e cercare nell'istogramma le dimensioni di restanti più grandi.

+0

Grazie per il tuo aiuto :) – aye

+0

Puoi fare lo stesso con VisualVM. –

Problemi correlati