Objektkopfgröße in Java auf 64-Bit-VM mit 4 GB RAM

8

Ich wollte wissen, ob die 64-Bit-VM einen 8-Byte-Objektheader anstelle von 12-Byte-Objektheadern verwenden kann, wenn der nutzbare RAM für die JVM ohnehin 4 GB beträgt.

Oder ist es unter Linux so, wenn nicht unter Windows? Könnte jemand das mit diesem Code testen?

%Vor%     
Daniel 27.06.2013, 06:22
quelle

3 Antworten

16

Es sieht nicht so aus, als ob es möglich ist, einen 8-Byte-Objektkopf auf einer 64-Bit-JVM zu haben. Der Header besteht aus einem "mark word", einem Zeiger auf die Klasse des Objekts, der Array-Größe im Falle eines Arrays und dem Auffüllen, um die nächste 8-Byte-Grenze zu erreichen.

%Vor%

Daher kann der Objektkopf auf einem 64-Bit-System so wenig wie 8 + 4 = 12 Bytes belegen, aber nicht weniger.

    
Joni 27.06.2013 16:24
quelle
3

Für 64-Bit-VMs gibt es Optionen:

  1. Verwendung von komprimierten Zeigern über -XX: + UseCompressedOops (in Java 6 standardmäßig aktiviert)

In diesem Fall: Objekt-Header werden 12 Byte sein, Array-Header werden 16 Byte sein (die letzten 4 Byte für die Größe des Arrays)

2.Verwenden Sie keine komprimierten Zeiger über -XX: -UseCompressedOops

In diesem Fall: Objekt-Header werden 16 Bytes sein, Array-Header werden 20 Bytes sein (die letzten 4 Bytes für die Größe des Arrays)

Der oben angegebene Code ist nicht VM-Bit-unabhängig und gibt unterschiedliche Ergebnisse für 32-Bit- und 64-Bit-VMs. Sie müssen Bit-Ness und komprimierte Oops-Faktoren berücksichtigen, um die richtige Größe zu berechnen.

    
NitinS 26.01.2014 08:31
quelle
-1
  

Verwendung von komprimierten Zeigern über -XX: + UseCompressedOops (auf Java 6 standardmäßig aktiviert)

Dies gilt nicht für alle Versionen von Java 6. -XX:+UseCompressedOops ist standardmäßig mit Java 6u25

aktiviert     
Mike Njong 11.02.2015 16:09
quelle

Tags und Links