IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> JVM--HotSpot虚拟机中的对象 -> 正文阅读

[数据结构与算法]JVM--HotSpot虚拟机中的对象

目录

一、对象的创建

1.1指针碰撞

1.2 空闲列表

二、对象的内存布局

2.1对象头

2.2实例数据

2.3对齐填充

三、对象的访问定位

3.1使用句柄?

?3.2直接指针

?3.3两者区别


一、对象的创建

????????类加载完成之后,虚拟机将为新生对象分配内存。在虚拟机中有两种分配内存的方式,分别为指针碰撞和空闲列表。

1.1指针碰撞

假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,分配内存时仅需要把作为分界点指示器的指针向空闲方向挪动一段与对象大小相等的距离即分配完成。

?

1.2 空闲列表

? ? ? ? 如果Java堆中的内存并不规整,已经被使用的内存与空闲的内存相互交错在一起,那就没办法简单的进行指针碰撞了,虚拟机必须维护一个列表,记录哪些内存块是可用的,在分配的时候从列表找到一块足够大的内存空间划分给对象示例,并更新列表上的记录。

?

?

?

?

? ? ? ? ?在并发的情况下虚拟机创建对象并不安全,为了解决这个问题有两种方案可选:一种是对分配内存空间的动作进行同步处理;另一种是把内存分配的动作按线程划分在不同空间之中进行,即每个线程在Java堆中预先分配一小块内存,成为本地线程分配缓冲(TALB)

二、对象的内存布局

? ? ? ? 在HotSpot虚拟机里,对象在堆内存中的存储布局划分为三个部分:对象头、实例数据和对齐填充。

2.1对象头

? ? ? ? 对象头部分包括两类信息。第一类是用于存储对象自身运行时的数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。这部分数据的长度在32位和64位的虚拟机中分别位32bit和64bit,官方称位“MarkWord”,MarkWord是一个有着动态定义的数据结构。对象头的另一部分是类型指针,即对象指向它的类型元数据的指针。如果对象是一个数组,对象头中还必须有一块用于记录数组长度的数据。

2.2实例数据

? ? ? ? 对象真正存储的有效信息。这部分的存储顺序会收到虚拟机分配策略参数(-XX:FieldsAllocationStyle参数)和字段在Java源码中定义的顺序的影响。HotSpot虚拟机默认的分配顺序为:longs/doubles、ints、shorts/chars、bytes/booleans、oops

2.3对齐填充

? ? ? ? 这部分不是必然存在的,仅仅起着占位符的作用。HotSpot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍。如果对象实例数据部分没有对齐的话,就需要通过对齐填充来补全。

三、对象的访问定位

????????Java程序会通过栈上的reference数据来操作堆上的具体对象,但reference只规定了它是一个指向对象的引用,对象的访问方式是由虚拟机实现而定的,主流访问方式有使用句柄和直接指针两种。

3.1使用句柄?

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

?3.2直接指针

? ? ? ? Java堆中对象的内存布局就必须考虑如何放置访问类型数据的相关 信息,reference中存储的直接就是对象地址,如果只是访问对象本身的话,就不需要多一次间接访问 的开销

?3.3两者区别

? ? ? ? 两种对象访问方式各有优势,使用句柄访问最大的好处就是reference中存储的是稳定句柄地址;使用直接指针访问的最大好处就是速度更快,节省了一次指针定位的时间开销。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:43:30  更:2022-03-16 22:50:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:43:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码