Java对象存储内存布局详解

 更新时间:2023年04月28日 10:37:40   作者:在下uptown  
众所周知,Java是一门面向对象的语言,那么一个对象在内存中都包含什么东西呢,本文主要详细介绍了Java对象的内存布局,访问定位,创建过程,线程安全,感兴趣的小伙伴可以跟着小编一起来学习

Java对象存储内存布局

众所周知,Java是一门面向对象的语言,那么一个对象在内存中都包含什么东西呢,首先,对象大部分是存储在堆上的(逃逸除外 )。

那么对象存储在堆中主要分为三个部分

  • 对象头、对象实例数据、对齐补充(数组会多一个数组长度)
  • 对象头:

    mark word: 存储对象的hashCode、锁信息(锁升级)或分代年龄或GC标志等信息

    类型指针: 存储指向对象所属类(元数据中class文件)的指针,JVM通过这个确定这个对象属于哪个类

  • 对象实例数据:

    new出的对象信息,存放类的属性数据信息,包括父类的属性信息;

  • 对齐补充

    数组对象会多对齐填充

    JVM要求对象占用的空间必须是8 的倍数,方便内存分配(以字节为最小单位分配),因此这部分就是用于填满不够的空间凑数用的。

Java对象的访问定位

  • 主流的访问方式主要有句柄直接指针
  • 句柄

    Java堆中划分出一块内存作为句柄池,栈中的reference中存储的事对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自具体的地址信息

  • 直接指针

    java堆中对象的内存布局必须考虑如何防止访问类型数据的相关信息,reference中存储的直接是对象地址。

  • 直接指针访问对象不需要多一次间接访问开销,而句柄方便在对象地址发生改变时(垃圾回收会移动对象地址)只需要改变句柄中的指针引用本身不需要改变。

**
**

Java对象的创建过程

  • 虚拟机遇到new指令时,先去检查指定的类是否被加载、验证、准备为类中的所有静态变量分配内存空间,并为其设置一个初始值 解析、初始化过。

  • 类检查后虚拟机为新对象分配内存

    如何保证并发情况分配堆内存安全

    虚拟机采用CAS配上失败重试保证原子性

    把内存分配交给线程,在创建线程时分配空间,把分配内存的任务交给线程支配。通过TLAB(Thread local Allocation Buffer)开启

  • 分配完内存后设置对象头,如哪个类的实例、hashcode、类的元数据信息指针(方法区)

  • 执⾏ init ⽅法(内核方法),初始化成员变量,执⾏实例化代码块,调⽤类的构造⽅法,并把堆内对象的⾸地址赋 值给引⽤变量。

Java对象分配内存是否线程安全

  • CAS 加失败重试保证更新原⼦性。

  • 把内存分配按线程划分在不同空间,即每个线程在 Java 堆中预先分配⼀⼩块内存,叫做本地线程分配缓冲 TLAB,哪个线程要分配内存就在对应的 TLAB 分配,TLAB ⽤完了再进⾏同步。

Java类实例化顺序

  • 父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
  • 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
  • 父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
  • 父类构造方法
  • 子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
  • 子类构造方法

到此这篇关于Java对象存储内存布局详解的文章就介绍到这了,更多相关Java对象内存布局内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot项目集成Flyway详细过程

    SpringBoot项目集成Flyway详细过程

    今天带大家学习SpringBoot项目集成Flyway详细过程,文中有非常详细的介绍及代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Idea 搭建Spring源码环境的超详细教程

    Idea 搭建Spring源码环境的超详细教程

    这篇文章主要介绍了Idea 搭建Spring源码环境,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 4位吸血鬼数字的java实现思路与实例讲解

    4位吸血鬼数字的java实现思路与实例讲解

    今天小编就为大家分享一篇关于4位吸血鬼数字的java实现思路与实例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • spring boot 1.5.4 web容器定制(端口号等修改)方法

    spring boot 1.5.4 web容器定制(端口号等修改)方法

    下面小编就为大家带来一篇spring boot 1.5.4 web容器定制(端口号等修改)方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 浅谈Ribbon、Feign和OpenFeign的区别

    浅谈Ribbon、Feign和OpenFeign的区别

    这篇文章主要介绍了浅谈Ribbon、Feign和OpenFeign的区别。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 微信小程序登录状态java后台解密

    微信小程序登录状态java后台解密

    这篇文章主要为大家详细介绍了微信小程序登录状态java后台解密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Spring事件监听详解

    Spring事件监听详解

    这篇文章主要介绍了Spring事件监听详解,文中有非常详细的图文解说及代码示例,对正在学习java Spring的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • 使用@Value注解从配置文件中读取数组

    使用@Value注解从配置文件中读取数组

    这篇文章主要介绍了使用@Value注解从配置文件中读取数组的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • ChatGPT-4.0未来已来 你来不来

    ChatGPT-4.0未来已来 你来不来

    最近听说了一个非常火的技术ChatGPT4.0,今天这篇文章就给大家介绍一下ChatGPT究竟是什么东东,不得不说ChatGPT是真的强,下面就让我们一起了解究竟什么是ChatGPT吧
    2023-03-03
  • 使用Mybatis-Plus时的SqlSessionFactory问题及处理

    使用Mybatis-Plus时的SqlSessionFactory问题及处理

    这篇文章主要介绍了使用Mybatis-Plus时的SqlSessionFactory问题及处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论