diff --git a/source/_posts/other/使用jolcore库查看Java对象大小.md b/source/_posts/other/使用jolcore库查看Java对象大小.md new file mode 100644 index 0000000..0195a4d --- /dev/null +++ b/source/_posts/other/使用jolcore库查看Java对象大小.md @@ -0,0 +1,97 @@ +--- +title: 使用jolcore库查看Java对象大小 +tags: Java技术 +categories: 技术随笔 +abbrlink: 155251202 +date: 2024-03-06 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 +```