當我們在使用 Java 編程語言時,對象頭、句柄和類型指針這些概念是不可避免的。
Java 的對象頭包含了對象的標記、類信息、數組大小等數據。每個對象都有一個對象頭,該對象頭在任何情況下都不變。對象頭雖然很小,但是卻固定在堆中每個對象的起始位置處。對象頭的大小一般是 8 個字節。
public class ObjectHeaderDemo { public static void main(String[] args) { Object obj = new Object(); long header = ObjectHeaderUtil.getObjectHeaderSize(obj); System.out.println(header); } } class ObjectHeaderUtil { private static Unsafe unsafe; static { try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); unsafe = (Unsafe) field.get(null); } catch (Exception e) { e.printStackTrace(); } } static long getObjectHeaderSize(Object obj) { Object[] array = new Object[]{obj}; long address = unsafe.getLong(array, unsafe.arrayBaseOffset(Object[].class)); return address; } }
Java 中的句柄(Handle)是一個對象的引用,它指向對象所在的內存地址。使用句柄的好處是,當對象被移動時,只需修改句柄指向的內存地址即可,因此可以避免在操作大對象時頻繁地進行內存拷貝,提高了效率。
Java 中的類型指針(Klass Pointer)指向對象所屬類的描訴信息,包含了類的訪問控制信息、繼承關系等數據。類型指針的長度與對象頭一樣,也是 8 個字節。
總的來說,Java 中的對象頭、句柄和類型指針對于了解 JVM 內存結構以及 Java 編程語言的底層工作原理非常重要。