2012-06-18 14 views
5

Ho una classe e mi piacerebbe vedere quali oggetti secondari occupano più spazio quando l'oggetto di questa classe è serializzato. C'è qualche bel strumento/modo per farlo, se non guardando il codice e analizzandolo manualmente?Java: un modo semplice per ispezionare la struttura dell'oggetto serializzato?

Ad esempio, mi piacerebbe che lo strumento dicesse "membro a occupa il 20%, b il 30% e il membro c occupa il 50%".

Grazie

P.S. Ho trovato alcune domande correlate, ma non ho trovato risposta alla mia domanda specifica lì.

+0

possibilmente correlate: [dimensioni oggetto Estimating Java con Strumentazione] (http://marxsoftware.blogspot.com/2011/12/estimating-java-object-sizes-with .html) – npe

+0

Vedere il mio commento a # alexey28 - Mi interessa la struttura dell'oggetto serializzato, non la struttura dell'oggetto in memoria – duduamar

+1

Non ci sono 'sottooggetti' in java. E non è un problema semantico. Come si conta la quota se due membri di un oggetto hanno stessi membri comuni? – aalku

risposta

-1

Beh, non ho mai sentito parlare di questo strumento. Ma penso che ci sia qualche relazione tra la dimensione dell'oggetto nella memoria e la dimensione dell'oggetto serializzato. Quindi puoi provare a utilizzare un profiler: VisualVM, incluso in JDK o il mio preferito YourKit Profiler.

+1

C'è qualche relazione ma non quella forte relazione: la classe può scegliere di serializzare alcuni membri e scartarne altri. Questo può cambiare completamente l'immagine ... – duduamar

+0

Lascia il posto a qualche altra risposta. Se nessuno conosce questo tipo di strumento e hai bisogno di misurare la precisione, devi scrivere il tuo per farlo. – alexey28

1

L'unico modo relativamente veloce per contare la dimensione dell'oggetto è innanzitutto scrivere l'intero oggetto, contare l'utilizzo (ad esempio, scrivere in un ByteArrayOutputStream) e quindi scrivere ogni oggetto a cui si fa riferimento.

Ci sono un paio di questo da tenere in considerazione:

  • L'ObjectOutputStream fa fare un po 'di caching per essere in grado di fare riferimento a un oggetto precedentemente scritto con un semplice puntatore. Utilizzare il metodo reset() per cancellare questa cache.
  • Ogni nuovo tipo di oggetto che viene scritto, per prima cosa ha la descrizione della classe. Il sovraccarico dipende dal numero di oggetti dello stesso tipo a cui ti riferisci.
  • C'è un overhead (piccolo, 4 byte) per inizializzare ObjectOutputStream.

Per la descrizione del protocollo, leggere this description.

+0

Questo è il modo in cui ho pensato di farlo, a meno che non avrò una risposta migliore, questo sarà il modo. Grazie. – duduamar

Problemi correlati