2013-06-27 26 views
8

Tôi muốn biết nếu có một số cách để máy ảo 64 bit sử dụng tiêu đề đối tượng 8byte thay vì tiêu đề đối tượng 12byte nếu RAM có thể sử dụng cho JVM là 4GB.Kích thước tiêu đề đối tượng trong Java trên máy ảo 64bit với <4GB RAM

Hoặc có giống như trên Linux, nếu không phải trên cửa sổ? Ai đó có thể kiểm tra điều này với mã này?

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."); 
    } 
} 

Trả lời

16

Có vẻ như không thể có tiêu đề đối tượng 8 byte trên JVM 64 bit. Tiêu đề bao gồm một "từ đánh dấu", một con trỏ đến lớp của đối tượng, kích thước mảng trong trường hợp của một mảng, và đệm để đạt đến ranh giới 8-byte tiếp theo.

,------------------+------------------+------------------ +---------------. 
    | mark word  | klass pointer | array size (opt) | padding | 
    `------------------+------------------+-------------------+---------------' 
  • Dấu chữ có thể được sử dụng để lưu trữ con trỏ bản địa to implement locks and to help GC, vì vậy nó chiếm 8 byte trên một JVM 64-bit.
  • Với heap nhỏ hơn 32 GB con trỏ đến lớp của đối tượng is compressed to 4 bytes.
  • Đệm có thể được sử dụng để lưu trữ một trong các trường.

Vì vậy, tiêu đề đối tượng trên hệ thống 64 bit có thể chiếm ít nhất 8 + 4 = 12 byte, nhưng không ít hơn.

3

Đối với 64 bit máy ảo có những lựa chọn:

  1. Sử dụng con trỏ nén qua -XX: + UseCompressedOops (kích hoạt mặc định trên Java 6)

Trong trường hợp đó: tiêu đề đối tượng sẽ là 12 byte, tiêu đề mảng sẽ là 16 byte (4 byte cuối cùng cho kích thước của mảng)

2.Not sử dụng con trỏ nén qua -XX: -UseCompressedOops

Trong trường hợp đó: tiêu đề đối tượng sẽ là 16 byte, tiêu đề mảng sẽ là 20 byte (4 byte cuối cùng cho kích thước mảng)

Mã ở trên không có kích thước bit VM độc lập và sẽ cho kết quả khác nhau cho 32- bit và 64-bit vms. Bạn cần phải xem xét các yếu tố bit-ness và nén oops để tính toán kích thước chính xác.

-1

Sử dụng con trỏ nén qua -XX: + UseCompressedOops (kích hoạt mặc định trên Java 6)

Đây không phải là đúng đối với tất cả các phiên bản của Java 6. -XX:+UseCompressedOops được kích hoạt theo mặc định bắt đầu với Java 6u25

+0

Khi bạn tham khảo câu trả lời @NitinS, bạn có thể sử dụng các nhận xét thay vì đăng câu trả lời. –

Các vấn đề liên quan