--- title: 使用jolcore库查看Java对象大小 tags: Java技术 categories: 技术随笔 abbrlink: 155251202 date: 2024-03-011 14:22:05 keywords: description: cover: --- > 对象大小可以用jolcore包查看,本篇介绍jolcore的基本使用 # 引入依赖 ``` org.openjdk.jol jol-core 0.9 ``` # 具体使用 ``` ClassLayout layout = ClassLayout.parseInstance(new Object()); System.out.println(layout.toPrintable()); ``` # 测试代码 ``` import org.openjdk.jol.info.ClassLayout; public class JOLSample { public static void main(String[] args) { ClassLayout layout = ClassLayout.parseInstance(new Object()); System.out.println(layout.toPrintable()); System.out.println(); ClassLayout layout1 = ClassLayout.parseInstance(new int[]{1,2,3,4,5}); System.out.println(layout1.toPrintable()); System.out.println(); ClassLayout layout2 = ClassLayout.parseInstance(new A()); System.out.println(layout2.toPrintable()); } // -XX:+UseCompressedOops 默认开启的压缩所有指针 // -XX:+UseCompressedClassPointers 默认开启的只压缩对象头里的类型指针Klass Pointer // Oops:Ordinary Object Pointers //堆内存大于32G时,指针压缩会失效。 //堆内存小于4G时,不需要启用指针压缩,jvm会直接去除高32位地址。 public static class A { //8B mark word //4B Klass Pointer int id = 6; //4B String name; //4B byte b; //1B Object o; //4B } } ``` # 打印结果 ``` 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) 00 1c 2f c5 (00000000 00011100 00101111 11000101) (-986768384) 12 4 (object header) 9a 02 00 00 (10011010 00000010 00000000 00000000) (666) Instance size: 16 bytes Space losses: 0 bytes internal + 0 bytes external = 0 bytes total [I 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) 68 0b 2f c5 (01101000 00001011 00101111 11000101) (-986772632) 12 4 (object header) 9a 02 00 00 (10011010 00000010 00000000 00000000) (666) 16 4 (object header) 05 00 00 00 (00000101 00000000 00000000 00000000) (5) 20 4 (alignment/padding gap) 24 20 int [I. N/A 44 4 (loss due to the next object alignment) Instance size: 48 bytes Space losses: 4 bytes internal + 4 bytes external = 8 bytes total com.locaris.jvm.JOLSample$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) 10 f6 9c c5 (00010000 11110110 10011100 11000101) (-979569136) 12 4 (object header) 9a 02 00 00 (10011010 00000010 00000000 00000000) (666) 16 4 int A.id 6 20 1 byte A.b 0 21 3 (alignment/padding gap) 24 8 java.lang.String A.name null 32 8 java.lang.Object A.o null Instance size: 40 bytes Space losses: 3 bytes internal + 0 bytes external = 3 bytes total ```