Wie viel Speicher ist für ein Integer-Objekt in Java reserviert? Wie finde ich diesen Wert für ein benutzerdefiniertes Objekt heraus? [Duplikat]

8

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?

    
Roman 27.10.2010, 08:31
quelle

3 Antworten

14

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

    
Thilo 27.10.2010 08:40
quelle
1

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.

    
Ankit 23.07.2012 16:33
quelle
0

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.

    
Frédéric Hamidi 27.10.2010 08:40
quelle