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%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.
Für 64-Bit-VMs gibt es Optionen:
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.
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