2013-06-27 16 views
8

Volevo sapere se esiste un modo per far sì che le macchine virtuali a 64 bit usino intestazioni di oggetto 8byte anziché 12 byte di intestazioni oggetto se la RAM utilizzabile per la JVM è comunque 4 GB.Dimensione intestazione dell'oggetto in Java su macchine virtuali a 64 bit con <4 GB di RAM

Oppure è così su Linux, se non su Windows? Qualcuno potrebbe testarlo con questo codice?

import java.lang.reflect.Field; 
import sun.misc.Unsafe; 
public class ObjectSizes { 
    String s1; 
    String s2; 
    public static void main(String[] args) throws Exception { 
     Unsafe unsafe; 
     try { 
      Field field = Unsafe.class.getDeclaredField("theUnsafe"); 
      field.setAccessible(true); 
      unsafe = (Unsafe)field.get(null); 
     } catch (Exception ex) { 
      throw new RuntimeException("Can't get Unsafe instance.", ex); 
     } 
     Field s1Field = ObjectSizes.class.getDeclaredField("s1"); 
     Field s2Field = ObjectSizes.class.getDeclaredField("s2"); 
     long s1OffSet = unsafe.objectFieldOffset(s1Field); 
     long s2OffSet = unsafe.objectFieldOffset(s2Field); 
     System.out.println("We are running "+System.getProperty("java.version")); 
     System.out.println("Object header size is "+s1OffSet+" bytes."); 
     System.out.println("Object reference size is "+(s2OffSet-s1OffSet)+" bytes."); 
    } 
} 

risposta

16

Non sembra come se fosse possibile avere un colpo di testa oggetto di 8 byte su una JVM a 64 bit. L'intestazione consiste in una "parola chiave", un puntatore alla classe dell'oggetto, la dimensione dell'array in caso di una matrice e il riempimento per raggiungere il prossimo limite di 8 byte.

,------------------+------------------+------------------ +---------------. 
    | mark word  | klass pointer | array size (opt) | padding | 
    `------------------+------------------+-------------------+---------------' 
  • il marchio può essere utilizzato per memorizzare i puntatori nativi to implement locks and to help GC, in modo che occupa 8 byte su una JVM a 64 bit.
  • Con heap inferiori a 32 GB il puntatore alla classe dell'oggetto is compressed to 4 bytes.
  • Il padding può essere utilizzato per memorizzare uno dei campi.

Pertanto l'intestazione dell'oggetto su un sistema a 64 bit può occupare un minimo di 8 + 4 = 12 byte, ma non inferiore.

3

Per 64 bit VM ci sono le opzioni:

  1. utilizzando i puntatori compressi via XX: + UseCompressedOops (abilitato di default su Java 6)

In tal caso: intestazioni oggetto verrà 12 byte, intestazioni matrice saranno 16 byte (ultimi 4 byte per dimensione della matrice)

2.Non usando puntatori compressi via XX: -UseCompressedOops

In tal caso: intestazioni oggetto verrà 16 byte, intestazioni matrice sarà di 20 byte (ultimi 4 byte per dimensione della matrice)

Il codice di cui sopra non è VM bit-formato indipendente e darà risultati diversi per 32- bit e vms a 64 bit. È necessario considerare i fattori bit-ness e ops compressi per calcolare le dimensioni corrette.

-1

Usando puntatori compressi via XX: + UseCompressedOops (abilitato di default su Java 6)

Questo non è vero per tutte le versioni di Java 6. -XX:+UseCompressedOops è abilitato di default a partire da Java 6u25

+0

Come si fa riferimento alla risposta @NitinS, è possibile utilizzare i commenti anziché inviare una risposta. –

Problemi correlati