Was ist der richtige Weg zu messen, wie viel Speicher vom Heap verwendet werden soll, um ein neues Objekt eines bestimmten Typs zu erstellen (lassen Sie uns über Integers sprechen, um es einfach zu halten)?
Kann dieser Wert ohne Experiment berechnet werden? Was sind die Regeln in diesem Fall? Sind diese Regeln irgendwo genau festgelegt oder können sie von jvm bis jvm variieren?
Es könnte von JVM zu JVM variieren.
Vielleicht möchten Sie diesen Blogbeitrag von einem Oracle-Ingenieur:
Im Fall einer Java-Ganzzahl auf einer 32-Bit-Hotspot-JVM wird die 32-Bit-Nutzlast (ein Integer.value-Feld) von 96 zusätzlichen Bits, einer Marke, einer Klasse und einem Wort der Ausrichtungsauffüllung begleitet , für insgesamt 128 Bits. Wenn es (zum Beispiel) sechs Referenzen auf diese ganze Zahl in der Welt gibt (Threads plus Heap), belegen diese Referenzen außerdem 192 Bits für insgesamt 320 Bits. Auf einer 64-Bit-Maschine ist alles doppelt so groß, zumindest derzeit: 256 Bits im Objekt (das jetzt 96 Bits Padding enthält) und 384 Bits an anderer Stelle. Im Gegensatz dazu belegen sechs Kopien einer ungepanzerten primitiven Ganzzahl 192 Bits
Vielleicht möchten Sie sich die Java-Instrumente ansehen, um das herauszufinden. Hier ist ein Beispiel für dasselbe.
In Ihrem Fall, da ich glaube, dass Sie die Größe der Objekte in Ihrer Anwendung finden möchten, stellen Sie das Instrumentation-Objekt global zur Verfügung ( static
), damit Sie über Ihre Anwendung darauf zugreifen können.
Vom Link kopierter Code :
%Vor%Ich glaube jedoch, dass Sie in der Lage sein werden, nur die Größe von Objekten zu finden (nicht primitive Typen, auch müssen Sie sie nicht herausfinden, wie Sie sie bereits kennen :-))
Beachten Sie, dass die Methode getObjectSize () den verwendeten Speicher nicht enthält durch andere Objekte, auf die das übergebene Objekt verweist. Zum Beispiel wenn Objekt A hat einen Verweis auf Objekt B und dann auf den gemeldeten Speicher von Objekt A Die Verwendung enthält nur die Bytes, die für den Verweis auf Objekt B benötigt werden (normalerweise 4 Bytes), nicht das eigentliche Objekt.
Um eine "tiefe" Zählung der Speicherbelegung eines Objekts zu erhalten (dh "Unterobjekte" oder Objekte, auf die das "Haupt" -Objekt verweist), können Sie den für Beta-Download verfügbaren Classmexer-Agenten von diese Website.
Das ist in Java nicht einfach: sizeof
existiert nicht und alternative Lösungen, wie das Serialisieren der Objekte in einen Bytestrom und das Betrachten der Länge des resultierenden Streams, funktionieren nicht immer (zB Strings).
Siehe jedoch diese ziemlich komplizierte Implementierung mit dem Objekt Grafiken.
Tags und Links java memory performance memory-management jvm