JVM-JVM中对象的结构

对象内存布局

在这里插入图片描述

对象里的三个区:

  1. 对象头(Header):Java对象头占8byte。如果是数组则占12byte。因为JVM里数组size需要使用4byte存储。
    标记字段MarkWord:
    用于存储对象自身的运行时数据,它是synchronized实现轻量级锁和偏向锁的关键。
    默认存储:对象HashCode、GC分代年龄、锁状态等等信息。
    为了节省空间,也会随着锁标志位的变化,存储数据发生变化。
    标记字段的结构:
    在这里插入图片描述
    类型指针KlassPoint:
    是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例
    开启指针压缩存储空间4byte,不开启8byte。
    JDK1.6+默认开启
    **数组长度:**如果对象是数组,则记录数组长度,占4个byte,如果对象不是数组则不存在。
    **对齐填充:**保证数组的大小永远是8byte的整数倍。

  2. 实例数据(Instance Data):生成对象的时候,对象的非静态成员变量也会存入堆空间

  3. 对齐填充(Padding):JVM内对象都采用8byte对齐,不够8byte的会自动补齐。

案例1:

<dependency>
	<groupId>org.openjdk.jol</groupId>
	<artifactId>jol-core</artifactId>
	<version>0.9</version>
</dependency>
 Object o = new Object();
        System.out.println("new Object:" +
                ClassLayout.parseInstance(o).toPrintable());

在这里插入图片描述
注:首先对象头是包含MarkWord和类型指针这两部分信息的;
开启指针压缩的情况下,存放Class指针的空间大小是4字节,MarkWord是8字节,对象头为12字节;
新建Object对象,会在内存占用16个字节,其中Header占12个(MarkWord占8个+KlassPoint占4个),没有实例数据,补充对齐4个。
结论:对象大小 = 对象头12 + 实例数据0 + 对齐填充4 = 16 bytes
在这里插入图片描述
案例2:

public class TT {
   
    public static void main(String[] args) {
   
        Hero a = new Hero();
        System.out.println("new A:" +
                ClassLayout.parseInstance(a).
                        toPrintable());
        Hero b = new Hero(1, true, "test");
        System.out.println("赋值后:" +
                ClassLayout.parseInstance(b).
                        toPrintable());
    }

    static class Hero {
   
        int i;
        boolean flag;
        String str;

        public Hero() {
   

        }

        public Hero(int i, boolean flag, String str) {
   
            this.i = i;
            this.flag = flag;
            this.str = str;
        }
    }
}

在这里插入图片描述
对象的大小 = 12对象头 + 4*3的实例数据 + 0的填充 = 24bytes

对象的访问

有两种方式:

  1. 句柄:稳定,对象被移动只要修改句柄中的地址
    在这里插入图片描述

  2. 直接指针:访问速度快,节省了一次指针定位的开销
    在这里插入图片描述
    对象类型数据存储的是对象的元信息,比如有哪些字段,那些方法

相关推荐

  1. JVMGC如何判断对象可以被回收

    2024-02-17 11:12:01       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-17 11:12:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-17 11:12:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-17 11:12:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-17 11:12:01       20 阅读

热门阅读

  1. 打印最小公倍数

    2024-02-17 11:12:01       30 阅读
  2. 2/13 homework

    2024-02-17 11:12:01       22 阅读
  3. P1914 小书童——凯撒密码

    2024-02-17 11:12:01       27 阅读
  4. rtt设备io框架面向对象学习-uart设备

    2024-02-17 11:12:01       34 阅读
  5. Linux命令-bzcat命令(解压缩指定的.bz2文件)

    2024-02-17 11:12:01       22 阅读
  6. 索引失效场景

    2024-02-17 11:12:01       30 阅读
  7. 这是 30 年来创办公司的最佳时机。

    2024-02-17 11:12:01       33 阅读
  8. Grafana入门:从0开始打造动态仪表板

    2024-02-17 11:12:01       31 阅读
  9. 2.16C语言学习

    2024-02-17 11:12:01       27 阅读
  10. JDK 8 安装及环境配置

    2024-02-17 11:12:01       34 阅读