new Object() 和 new byte[0]占多少字节

    技术2023-10-21  100

    使用的工具

    <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.10</version> </dependency>

    代码

    public class Test { public static void main(String[] args) throws IOException { System.out.println(ClassLayout.parseInstance(new byte[0]).toPrintable()); System.out.println("-------------------"); System.out.println(ClassLayout.parseInstance(new Object()).toPrintable()); } }

    输出结果

    32位虚拟机
    [B object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 09 00 00 00 (00001001 00000000 00000000 00000000) (9) 4 4 (object header) 78 04 96 06 (01111000 00000100 10010110 00000110) (110494840) 8 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 12 0 byte [B.<elements> N/A 12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total ------------------- java.lang.Object object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 05 00 00 00 (00000101 00000000 00000000 00000000) (5) 4 4 (object header) 70 0d 96 06 (01110000 00001101 10010110 00000110) (110497136) Instance size: 8 bytes Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

    可以看到,在32位虚拟机下,byte数组对象头总共12个字节,前4个字节存储的是mark word,接下来4个字节是指向对象所属的类的指针,也就是指向byte[].class的指针,最后4个字节保存数组的长度。 接下来是数组元素列表,由于这里是数组长度是0,所以,这里没有元素,占用0个字节,最后4个字节是对齐填充(为了加快访问速度,java对象的大小必然是8的整数倍),总共占用了16个字节。 object对像只有对象头,mark word 4个字节,class指针4个字节。总共占用8个字节。

    64位虚拟机
    [B 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) 27 42 07 00 (00100111 01000010 00000111 00000000) (475687) 12 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 16 0 byte [B.<elements> N/A Instance size: 16 bytes Space losses: 0 bytes internal + 0 bytes external = 0 bytes total ------------------- java.lang.Object object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 05 00 00 00 (00000101 00000000 00000000 00000000) (5) 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 8 4 (object header) 96 20 00 00 (10010110 00100000 00000000 00000000) (8342) 12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

    64位虚拟机默认开启了指针压缩,因此,class指针只占用4个字节,如果不开启指针压缩,指针将会占用8个字节。所以byte数组对象头 mark word是8个字节,class指针是4个字节,数组大小4个字节,因此byte数组不需要对齐,总共16字节,object对象 mark word 8字节,class直接4个字节,填充4个字节,总共16字节。

    Processed: 0.011, SQL: 9