Java对象模型

news2024/10/5 23:28:14

介绍

  • Java是一种面向对象的语言,而Java对象在JVM中存储是由一定结构的。而这个 Java对象自身的存储模型称之为Java对象模型
  • HotSpot虚拟机中,设计了一个OOP-Klass Model.OOP指的是普通对象指针,而Klass用来描述对象的具体类型。
  • 如下图所示是一个简单的Java对象的OOP-Klass模型,也就是Java对象模型
    java对象模型图

Java对象创建过程

  • 类加载检查:虚拟机遇到new字节码指令的时候,首先去检查这个指令的参数是够可以在常量池中找到对象的符号引用,并且检查这个符号引用是否已经被加载过、解析、和初始化过,如果没有,则必须先要执行相应的类加载过程
  • 分配内存:在类加载检查完后,接下来虚拟机会为对象分配内存。对象所需的大小在类加载完成后便可确定,为对象分配空间的任务相当于在堆中开辟出一块确定的大小,分配方式有指针碰撞空闲列表两种,具体使用哪种还需要看Java堆的规整程度,是够规整取决于使用的何中垃圾回收算法,如果使用标记压缩则使用指针碰撞,标记清除则使用空闲列表
  • 初始化零值:内存分配完成后,虚拟机要对对象完成必要的设置,例如这个对象是哪个类的实例,如果才能找到类的元数据信息对象的哈希码GC分代年龄等信息都是存放在对象头中的。另外根据虚拟机当前的运行状态不同,来看是否生成偏向锁(锁的标志在对象头中)对象头有不同的设置方式
  • 执行init方法:上面几步完成之后对于虚拟机来说对象已经创建完成了,但是对于Java程序来说还需要执行init方法来完成相关变量的初始化

并发内存分配问题

在创建对象的时候有一个非常重要的问题就是线程安全问题,在实际开发过程中,对象创建是非常频繁的,作为虚拟机而言必须要保证线程是安全的,通常来讲有两种方式来保证线程安全

  • CAS+失败重试:CAS乐观锁是一种实现方式,每次不进行加锁,认为不会产生冲突,产生冲突就不断地重试,直到成功为止
  • TLAB:为每个线程在Eden区分配一块固定内存,JVM在给线程中的对象分配内存的时候首先将对象分配在TLAB中,当对象的大小大于TLAB或者tlab空间用完了则使用CAS+失败重试

Java对象的访问定位方式

Java是通过引用的方式来操作堆上的对象的,那么如何通过引用定位、访问对象的具体位置。对象的访问方式是由虚拟机来决定的,主流的有以下两种

  • 句柄池:简单来说就是在堆中开辟出一块空间作为句柄池,引用中存储对象的句柄地址,句柄中包含对象的实例数据、类型数据的地址信息。优点是引用中稳定的存储地址信息,在对象被移动的时候只需要改变句柄中实例数据的指针就可以了,不需要改变引用本身句柄池查找对象方式图
  • 直接指针:与句柄池不同,ref引用中直接存储的就是对象的实例数据,但是对象的类型还是和句柄池的方式相同。优点很明显那就是速度快,和句柄池相比省下了一次指针定位的时间开销直接指针方式图
  • 内存溢出有两种:StackOverFlowError:当请求的栈深度大于虚拟机所允许的最大深度、OutOfMemoryError:虚拟机在扩展栈时无法申请到足够的内存空间[一般都能设置扩大]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/418460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字节测试总监8年测试路,如何从功能测试转成自动化测试——愿测试人不再迷茫

我大学学的计算机专业,有一点编程基础。我的软件测试职业开始和大多数测试人员一样,一开始在一家电商公司做软件功能测试。 大部分进入测试行业的朋友,最开始接触都是纯功能界面测试,随着工作年限,会接触到一些常用测…

Python深度学习实战:人脸关键点(15点)检测pytorch实现

引言 人脸关键点检测即对人类面部若干个点位置进行检测,可以通过这些点的变化来实现许多功能,该技术可以应用到很多领域,例如捕捉人脸的关键点,然后驱动动画人物做相同的面部表情;识别人脸的面部表情,让机…

北邮22信通:(13)二叉树 统计结点总数 深度和叶子结点数

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 上一篇文章: 下一篇文章: 目录 一.统计结点总个数 二.统计二叉树深度 三.统计叶子结点总数 四.完整代码 4.1测试int存储类型&…

基于via的课堂学生行为数据标注 与yolov7目标检测与自动标注系统

目录0 相关链接1. 总体功能描述2.软件安装说明2.1. 环境搭建2.2. 激活环境2.3. 退出环境2.4. 删除环境2.5. 安装opencv3.标注数据处理3.1. 收集3.2.via对标注举手3.3. via 举手标注转化yolo格式3.4. via动作标注扩展3.5. via 举手看书写字标注转化yolo格式4. 标注数据检查与可视…

Vue3.0中的响应式原理

回顾Vue2的响应式原理 实现原理: - 对象类型:通过 Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。 - 数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹&…

jekins部署java和vue

一、安装jekins,下面安装的是2.387.2版本 必须安装有jdk11或jdk17 二、部署java项目 1.安装插件:Maven Integration plugin和Deploy to container Plugin 2.配置全局环境变量:jdk、git、maven 3.创建maven项目 cd docus-server/docus-serv…

深入底层谈谈String

深入底层谈谈String一、聊聊字符串拼接【底层】二、聊聊String实现(源码分析)实现的接口内部属性及其部分构造函数部分方法说明明明replace,replaceAll,substring等方法得到了新的字符串,为什么说String是不变的呢&…

kali设置静态ip地址

Kali设置静态ip地址 本篇文章主要分3部分讲解如何为Kali虚拟机配置静态IP地址,使其能够与主机和外网进行通信。首先需要配置VMware的虚拟网卡,然后配置Kali虚拟机,最后配置主机。 一、配置VMware 打开VMware,选择【编辑】—【虚…

C++游戏分析与破解方法介绍

1、C游戏简介 目前手机游戏直接用C开发的已经不多,使用C开发的多是早期的基于cocos2dx的游戏,因此我们这里就以cocos2d-x为例讲解C游戏的分析与破解方法。 Cocos2d-x是一个移动端游戏开发框架,可以使用C或者lua进行开发,也可以混…

Spring框架核心与设计思想

文章目录一、Spring是什么?二、什么是IoC容器?什么是IOC?Spring IoC三、DI总结一、Spring是什么? 我们一般所说的Spring指的是Spring Framework(Spring 框架),它是一个开源的框架,Spring支持广泛的应用场景…

Spring事务详解

🏆今日学习目标: 🍀Spring事务详解 ✅创作者:林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区,欢迎你的加入: 林在闪闪发光…

贯穿设计模式第三话--依赖倒转原则

🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 从今天开始,将…

【GPT4】GPT4 官方报告解读

欢迎关注【youcans的AGI学习笔记】原创作品 【GPT4】GPT-4 官方报告解读1. GPT-4 官方介绍2. GPT-4 的性能2.1 GPT-4 在各种学术和专业考试中的性能2.2 GPT-4 在传统机器学习测试中的性能2.3 GPT-4 在不同语言测试中的性能3. GPT-4 的图像输入功能3.1 GPT-4 图像输入案例3.2 GP…

《分解因数》:质因数分解

目录 一、题目&#xff1a; 二、思路&#xff1a; 三、代码&#xff1a; 一、题目&#xff1a; 分解因数 《分解因数》题目链接 所谓因子分解&#xff0c;就是把给定的正整数a&#xff0c;分解成若干个素数的乘积&#xff0c;即 a a1 a2 a3 ... an,并且 1 < a1…

<数据结构> 链表 - 单链表(c语言实现)

B.最简单结构的链表——不带哨兵位单链表的实现&#xff08;关于哨兵位结点&#xff09; 一、不带哨兵位单链表结点的创建1.1 typedef 链表的数据类型 1.2 结点的结构体创建 二、单链表要实现的功能 三、需要包含的头文件四、函数接口一览为什么有些函数参数传递的是二级指针&a…

【FreeRTOS(二)】FreeRTOS新手入门——计数型信号量和二进制信号量的基本使用并附代码解析

写在前面&#xff1a; 本文章如有错漏之处&#xff0c;敬请指正&#xff0c;另外本文为网络材料整理&#xff0c;侵删。 FreeRTOS信号量的基本使用&代码解析一、信号量概述二、计数型信号量三、二进制信号量四、信号量函数API1、创建信号量2、删除一个信号量3、信号量释放4…

ASP.NET动态Web开发技术第5章

第5章数据验证一.预习笔记 1.验证控件概述&#xff1a; 2.RequiredFieldValidator&#xff08;必填验证&#xff09; 常用属性1&#xff1a;ControlToValidator:被验证的输入控件的ID 常用属性2&#xff1a;Text&#xff1a;验证失败时&#xff0c;验证控件显示的文本 常用…

8.3 总体分布的假设检验

学习目标&#xff1a; 如果我要学习总体分布的假设检验&#xff0c;我会采取以下步骤&#xff1a; 掌握基础概念&#xff1a;学习和掌握统计学中基础的概念&#xff0c;如总体、样本、假设检验、p值等等。 学习检验方法&#xff1a;了解和学习不同的总体分布假设检验方法&…

亚信科技AntDB数据库荣膺第十二届数据技术嘉年华(DTC 2023)“最具潜力数据库”大奖

近日&#xff0c;亚信科技AntDB数据库产品在第十二届数据技术嘉年华&#xff08;DTC 2023&#xff09;峰会上斩获“2022年度最具潜力数据库”大奖。亚信安慧副总裁张桦先生受邀参会&#xff0c;并发表了《AntDB数据库通信行业核心系统应用与创新》的主题演讲&#xff0c;分享了…

vue实现好看的相册、图片网站

目录 一、效果图 1.项目访问地址 2.画虫官方效果图&#xff1a; 3.作者实现的效果图&#xff1a; 二、代码实现 1.项目结构截图 2.路由配置代码&#xff1a; 3. 头部底部主页面内容显示容器的代码 4.首页&#xff0c;即标签页的代码 三、项目启动说明 四、总结 一、…