2012-06-18 8 views
5

Ich habe eine Klasse und ich würde gerne sehen, welche Unterobjekte den meisten Platz einnehmen, wenn ein Objekt aus dieser Klasse serialisiert wird. Gibt es ein nettes Werkzeug/einen Weg, es zu tun, außer den Code zu betrachten und ihn manuell zu analysieren?Java - einfache Möglichkeit, die Struktur eines serialisierten Objekts zu überprüfen?

Zum Beispiel möchte ich das Tool sagen "Mitglied a besetzt 20%, b 30% und Mitglied c belegt 50%".

Dank

P. S. Ich habe einige verwandte Fragen gefunden, aber dort keine Antwort auf meine spezifische Frage gefunden.

+0

Möglicherweise verwandte: [Estimating Java Objektgrößen mit Instrumentation] (http://marxsoftware.blogspot.com/2011/12/estimating-java-object-sizes-with .html) – npe

+0

Siehe meinen Kommentar zu # alexey28 - Ich interessiere mich für die Struktur des serialisierten Objekts, nicht die Struktur des Objekts im Speicher – duduamar

+1

Es gibt keine 'Unterobjekte' in Java. Und es ist kein semantisches Problem. Wie zählen Sie die Freigabe, wenn zwei Mitglieder eines Objekts selbst Mitglieder haben? – aalku

Antwort

-1

Nun, ich habe noch nie von einem solchen Werkzeug gehört. Aber ich denke, es gibt eine Beziehung zwischen der Objektgröße im Speicher und der serialisierten Objektgröße. Sie können also versuchen, einen Profiler zu verwenden: VisualVM, der in JDK oder meinem Lieblings YourKit Profiler enthalten ist.

+1

Es gibt eine Beziehung, aber keine starke Relation - die Klasse kann einige Mitglieder serialisieren und andere verwerfen. Das kann das Bild total verändern ... – duduamar

+0

Läßt Weg für einige andere Antworten. Wenn niemand ein solches Werkzeug kennt und Sie eine Präzisionsmessung benötigen, müssen Sie Ihre eigene schreiben, um es zu tun. – alexey28

1

Die einzige relativ schnelle Möglichkeit, die Größe des Objekts zu zählen, besteht darin, zuerst das gesamte Objekt zu schreiben, die Verwendung zu zählen (z. B. in ByteArrayOutputStream zu schreiben) und dann jedes Objekt zu schreiben, auf das verwiesen wird.

Es gibt ein paar dies zu berücksichtigen:

  • Den Object einige Caching macht die Lage sein, mit einem einfachen Zeiger auf ein zuvor geschriebenes Objekt zu verweisen. Verwenden Sie die reset() -Methode, um diesen Cache zu löschen.
  • Jeder neue Objekttyp, der geschrieben wird, hat zuerst die Klassenbeschreibung. Der Aufwand hierfür hängt von der Anzahl der gleichartigen Objekte ab, auf die Sie sich beziehen.
  • Es gibt einen (kleinen, 4 Byte) Overhead, um den ObjectOutputStream zu initialisieren.

Für die Beschreibung des Protokolls, lesen Sie this description.

+0

So dachte ich es zu machen, es sei denn, ich werde eine bessere Antwort bekommen, das wird der Weg sein. Vielen Dank. – duduamar

Verwandte Themen