Java对象模型

介绍

  • 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:虚拟机在扩展栈时无法申请到足够的内存空间[一般都能设置扩大]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文章生成器写出来的原创文章

文章生成机器人 文章生成机器人是一种基于人工智能技术和自然语言处理算法的程序,可以自动地生成高质量、原创的文章。 文章生成机器人的优点如下: 提高工作效率:文章生成机器人能够在较短的时间内自动帮助用户生成大量的文章,提…

Python 小型项目大全 21~25

二十一、DNA 可视化 原文:http://inventwithpython.com/bigbookpython/project21.html 脱氧核糖核酸是一种微小的分子,存在于我们身体的每个细胞中,包含着我们身体如何生长的蓝图。它看起来像一对核苷酸分子的双螺旋结构:鸟嘌呤、…

计算机网络微课堂1-3节

目录 1. TCP/TP协议​编辑 2. 3.调制解调器 4.因特网的组成 5.电路交换 6.分组交换 重要常用 7.报文交换 8.总结电路交换 报文交换和分组交换 9. 1. TCP/TP协议 2. ISP 网络提供商 ISP的三层 国际 国家 和本地 3.调制解调器 什么是调制解调器,它存在的…

Python 小型项目大全 11~15

十一、标题党生成器 原文:http://inventwithpython.com/bigbookpython/project11.html 我们的网站需要欺骗人们去看广告!但是想出有创意的原创内容太难了。幸运的是,有了标题党生成器,我们可以让一台计算机产生数百万个令人发指的…

【Linux】浅析Input子系统

文章目录1. 框架1.1 数据结构1.2 evdev_handler1.3 evdev_init1.4 input_register_handler2. 应用如何打开节点并读取到事件数据2.1 evdev_fops2.2 evdev_open2.3 evdev_release2.4 evdev_read2.5 evdev_write2.6 evdev_poll2.7 evdev_fasync2.8 evdev_ioctl2.9 evdev_ioctl_co…

[考研数据结构]第3章之栈的基本知识与操作

文章目录 栈的基本概念 栈的实现 顺序栈 共享栈 链栈 栈的基本概念 栈的定义 栈(Stack)是只允许在一端进行插入或删除操作的线性表 相关术语 栈顶(Top)线性表允许进行插入或删除的那一端称之为栈顶栈底(Bottom&…

【计算机网络-数据链路层】集线器、网桥、交换机

本文许多文字和图片使用了湖科大教书匠(高军老师)的 PPT,在此表示感谢。正是他让非科班的我能以奇妙的方式走进网络的世界。 文章目录1 【物理层】集线器(Hub)——共享式以太网1.1 为什么使用集线器?1.2 集…

macOS Monterey 12.6.5 (21G531) Boot ISO 原版可引导镜像

本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 2023 年 4 月 10 日(北京…

ESXI 6.7全面系统教程~汇总

ESXI 6.7全面系统教程 许可证:0A65P-00HD0-375M1-M097M-22P7H esxi 是一个脱机系统,也是一个虚拟机系统与vmware 相比,它可以直接运行在硬件上,这样可以减少资源浪费,一般用于服务器上;下面是esxi 的完整…

stable-diffusion-webui-colab部署记录

stable-diffusion-webui-colab 该模型可以在网上云端部署stable-diffusion,减少本地部署的繁琐步骤降低配置要求的依赖。 一、进入stable-diffusion-webui-colab 1.网址:https://github.com/camenduru/stable-diffusion-webui-colab 在分支中选择driv…

我的创作纪念日:Unity CEO表示生成式AI将是Unity近期发展重点,发布神秘影片预告

PICK 未来的AI技术将会让人类迎来下一个生产力变革,这其中也包括生成型AI的突破性革新。各大公司也正在竞相推出AIGC工具,其中微软的Copilot、Adobe的Firefly、Github的chatGPT等引起了人们的关注。然而,游戏开发领域似乎还没有一款真正针对性…

Vulnhub:Digitalworld.local (Development)靶机

kali:192.168.111.111 靶机:192.168.111.130 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --scripthttp-enum 192.168.111.130 查看网站首页源码 访问development目录,提示存在一个流量包 查看流量包发现另一个网站路径:/devel…

java继承类怎么写

继承类是通过把父类的方法和属性继承到一个类中,而子类的方法和属性是子类自己定义的。 Java中有一个很重要的概念叫做继承,这也是 Java语言的精髓所在。Java语言提供了一种机制,叫做派生类。在 Java中,如果没有实现了某个派生类方…

python 调用c++

python中调用c,函数参数用 int类型,返回值为类型1,且返回值为 false。 注意:如果你使用了C中的 false,则返回的是-1。 在 Python中调用C时,你会得到一个名为 bool的类,其中包含了两个成员变量: …

多智能体深度强化学习在移动边缘计算的联合多通道访问和任务卸载中的应用

多智能体深度强化学习在移动边缘计算的联合多通道访问和任务卸载中的应用主要贡献与相关工作比较的贡献三、系统模型(only 2 pages)3.1 网络模型3.2 通信模型3.3 计算模型3.3.1 本地计算3.3.2 卸载计算四、预备知识(only 1 page)五…

SpringCloud-Gateway网关搭建整合nacos配置中心实现动态路由整合sentinel实现服务限流熔点降级

官方文档(更多配置详情直接查看官方文档) 为什么需要服务网关 传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调…

安全防御 --- 恶意代码、防病毒

一、恶意代码 1、按照传播方式分类 (1)病毒 概念:病毒是一种基于硬件和操作系统的程序,具有感染和破坏能力,这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地,它是病毒传播的目的地&#xff0…

MySQL库的操作

文章目录:创建数据库字符集和校验规则查看系统默认字符集和校验规则查看数据库支持的字符集查看数据库支持的字符集校验规则校验规则对数据库的影响操作数据库查看数据库显示创建语句修改数据库删除数据库数据库的备份和还原表的备份和还原查看连接情况创建数据库 …

数据库基础

文章目录前言一、什么是数据库二、主流数据库三、基本使用1.连接服务器2.服务器,数据库,表关系3.使用案例4.数据逻辑存储四、MySQL架构五、SQL分类六、存储引擎1.存储引擎2.查看存储引擎3.存储引擎对比总结前言 正文开始!!! 一、什么是数据库 存储数据用文件就可以了,为什么还…

【并发编程】AQS源码

ReentrantLock 互斥锁,可重入 AQS是可以支持互斥锁和共享锁的,这里只分析互斥锁的源码 加锁 公平锁和非公平锁 公平锁 final void lock() {acquire(1); //抢占1把锁.}// AQS里面的方法public final void acquire(int arg) { if (!tryAcquire(arg) &&acq…