iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java对象存储内存布局详解
  • 479
分享到

Java对象存储内存布局详解

Java对象存储内存布局Java内存布局Java对象内存 2023-05-18 08:05:20 479人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录Java对象存储内存布局Java对象的访问定位Java对象的创建过程Java对象分配内存是否线程安全Java类实例化顺序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对象内存布局内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java对象存储内存布局详解

本文链接: https://www.lsjlt.com/news/211848.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java对象存储内存布局详解
    目录Java对象存储内存布局Java对象的访问定位Java对象的创建过程Java对象分配内存是否线程安全Java类实例化顺序Java对象存储内存布局 众所周知,Java是一门面向对象...
    99+
    2023-05-18
    Java对象存储内存布局 Java内存布局 Java对象内存
  • 详解Java对象的内存布局
    目录前言对象内存构成对象头实例数据对齐数据结尾前言 今天来讲些抽象的东西 -- 对象头,因为我在学习的过程中发现很多地方都关联到了对象头的知识点,例如JDK中的 synchroniz...
    99+
    2024-04-02
  • c++对象内存布局示例详解
    目录前言继承对象的内存布局具有多重继承和虚拟功能的对象的内存布局总结前言 了解你所使用的编程语言究竟是如何实现的,对于C++程序员可能特别有意义。首先,它可以去除我们对于所使用语言的...
    99+
    2024-04-02
  • Java中对象的内存布局
    这篇文章主要讲解了“Java中对象的内存布局”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中对象的内存布局”吧!作为一名Java程序员,我们在日常工作中使用这款面向对象的编程语言时,...
    99+
    2023-06-15
  • Java对象的内存布局详细介绍
    目录一、对象头1)、Mark Word2)、类型指针3)、数组长度(只有数组对象才有)二、实例数据三、对齐填充四、使用JOL工具分析对象内存布局在HotSpot虚拟机中,对象在内存中...
    99+
    2023-02-13
    Java对象内存布局 Java内存布局 Java对象内存
  • 详解Java对象创建的过程及内存布局
    目录一、对象的内存布局二、对象的创建过程三、对象访问定位四、参考一、对象的内存布局 对象头 对象头主要保存对象自身的运行时数据和用于指定该对象属于哪个类的类型指针。 实例数据 保存对...
    99+
    2024-04-02
  • Java对象的内存布局全流程
    目录对象内存布局对象占用内存空间证明对象内存布局开始先抛出一个问题:一个对象o,Object o = new Object();创建完成后会占用多少字节的内存? 要能回答这个问题,就...
    99+
    2024-04-02
  • 怎么在Java中布局对象内存
    怎么在Java中布局对象内存?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实...
    99+
    2023-06-14
  • Java 对象在 JVM 中的内存布局超详细解说
    目录一、new 对象的几种说法二、Java 对象在内存中的存在形式1. 栈帧(Frame)2. 对象在内存中的存在形式 ①3. 对象中的方法存储在那儿?4. Java 对象在内存中的...
    99+
    2024-04-02
  • Java对象在内存中的布局是如何实现的?
    1、-XX:FieldsAllocationStyle 对象在内存中的布局首要相关配置就是FieldsAllocationStyle,这个配置有3个可选值,即0、1、2。当值为2的时...
    99+
    2024-04-02
  • 浅析Python的对象拷贝和内存布局
    目录前言Python 对象的内存布局牛刀小试查看对象的内存地址copy模块可变和不可变对象与对象拷贝代码片段分析撕开 Python 对象的神秘面纱总结前言 在本篇文章当中主要给大家介...
    99+
    2022-12-19
    Python对象拷贝 内存布局 Python对象拷贝 Python 内存布局
  • java存储以及java对象创建的流程(详解)
    java存储:1)寄存器:这是最快的存储区,位于处理器的内部。但是寄存器的数量有限,所以寄存器根据需求进行分配。我们不能直接进行操作。2)堆栈:位于通用RAM中,可以通过堆栈指针从处理器那里获取直接支持。堆栈指针往下移动,则分配新的内存。网...
    99+
    2023-05-31
    java 存储 对象创建
  • redis如何存储java对象
    redis存储java对象的方法:1、写一个java Bean,包含id和name两个字段,类名是Person。因为要实现序列化需求,所以该类实现Serializable接口。2、需要写一个序列化工具类,用于提供对象的序列化和反序列化的工作...
    99+
    2024-04-02
  • Python的对象拷贝和内存布局如何实现
    今天小编给大家分享一下Python的对象拷贝和内存布局如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言你知道下面一...
    99+
    2023-07-06
  • Python的对象拷贝和内存布局怎么实现
    前言你知道下面一些程序片段的输出结果吗?a = [1, 2, 3, 4] b = a print(f"{a = } \t|\t {b = }") a[0] = 100 print(f"{a = } \t|\t ...
    99+
    2023-05-15
    Python
  • Java面向对象和内存分析图文详解
    一、Java类 类是面向对象编程中最基本的单位。 Java中的类包含三个内容,分别是: 属性 属性又叫成员变量。 属性用于定义类或类对象的数据(静态特征)。 ...
    99+
    2024-04-02
  • ceph集群RadosGW对象存储使用详解
    目录集群背景:什么是对象存储ceph对象存储的构成RadosGW存储池作用RadosGW常用操作详解新建一个子用户操纵radosgw需要先安装好python3环境,以及python的...
    99+
    2024-04-02
  • Java对象创建内存案例解析
    Java对象创建内存图解析 1. 栈 Java栈的区域很小 , 特点是存取的速度特别快,栈存储的特点是, 先进后出,存储速度快的原因: 栈内存, 通过 栈指针'来创...
    99+
    2024-04-02
  • Spring使用注解存储和读取对象详解
    目录一、存储Bean对象配置扫描添加注解存储Bean对象注解使用范围Bean的命名五大类注解的关系为什么需要五大类注解二、方法注解@BeanBean重命名三、对象注入属性注入Sett...
    99+
    2023-05-16
    Spring注解存储和读取对象 Spring注解 Spring注解存储对象 Spring注解读取对象
  • 浅析C++内存布局
    目录虚拟内存 类的实例化对象所占的内存空间空类的实例化对象占1一个字节 类的成员函数不占用类对象的内存空间类的成员变量占用类对象的内存空间字节对齐原则虚拟内存&n...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作