<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.9</version> </dependency>
(1)示例
public class ObjLockTest { public static void main(String[] args) { Object o = new Object(); System.out.println("new Object:" + ClassLayout.parseInstance(o).toPrintable()); } }
控制台输出:
new Object:java.lang.Object object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 8 4 (object header) e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243) 12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
(2)示例:
public class ObjLockTest { public static void main(String[] args) { A a = new A(); System.out.println("new A:" + ClassLayout.parseInstance(a).toPrintable()); a.setFlag(true); a.setI(1); a.setStr("ABC"); System.out.println("赋值 A:" + ClassLayout.parseInstance(a).toPrintable()); } static class A { private boolean flag; private int i; private String str; public void setFlag(boolean flag) { this.flag = flag; } public void setStr(String str) { this.str = str; } public void setI(int i) { this.i = i; } } }
控制台输出:
new A:com.lock.ObjLockTest$A object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 8 4 (object header) 73 c9 00 f8 (01110011 11001001 00000000 11111000) (-134166157) 12 4 int A.i 0 16 1 boolean A.flag false 17 3 (alignment/padding gap) 20 4 java.lang.String A.str null Instance size: 24 bytes Space losses: 3 bytes internal + 0 bytes external = 3 bytes total 赋值 A:com.lock.ObjLockTest$A object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 8 4 (object header) 73 c9 00 f8 (01110011 11001001 00000000 11111000) (-134166157) 12 4 int A.i 1 16 1 boolean A.flag true 17 3 (alignment/padding gap) 20 4 java.lang.String A.str (object) Instance size: 24 bytes Space losses: 3 bytes internal + 0 bytes external = 3 bytes total
例如:
class C{ A a; B b; }
对象的大小 = 12B对象头 + 4B*2的实例数据 + 4B的填充 = 24B
class C{ A a; B b; D d; }
对象的大小 = 12B对象头 + 4B*3的实例数据 + 0B的填充 = 24B
原文:https://www.cnblogs.com/caoxb/p/12735570.html