【学习笔记】深入理解JVM之对象的实例化
创始人
2024-05-28 09:16:34
0

参考尚硅谷JVM 102 - 106 集

首发地址:地址
请添加图片描述

1、JVM对象的实例化

1.1 对象的创建方式

对象有一下几种创建对象的方式

  • new
Object object = new Object();
  • Class的newInstance()
Object object = Object.class.newInstance();
  • Constructor的newInstance(XXX)反射获取构造器,构造器.newInstance()
Object Object = Object.class.getConstructor().newInstance();
  • clone() 要想使用clone,必须实现Cloneable并重写clone方法
Test test = new Test();
Object clone = test.clone();
  • 反序列化(备注:需要实现序列化接口并且要先有序列化文件)

  • 第三方库 Objenesis

1.2 创建对象的步骤

创建对象有以下几种步骤:

  • 1、判断对象对应的类是否加载、链接、初始化。
  • 2、为对象分配内存
    • 如果内存规整 > 指针碰撞
    • 如果内存不规整
      • 虚拟机需要维护一个列表
      • 空闲列表分配
  • 3、处理并发安全问题
    • 采用 CAS 配上失败重试保证更新到的原子性
    • 每个线程预先分配一块 TLAB
  • 4、初始化分配到的空间
    • 所有属性设置默认值,保证对象实例字段在不赋值的时可以直接使用
  • 5、设置对象的对象头
  • 6、执行 init 方法进行初始化

2、对象的内存布局

对象的内存布局不是JVM规范的一部分,属于实现的细节,Hotspot将对象分成3部分: 对象头、实例数据、对齐填充

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F3jLC5aT-1673618806604)(/Users/tiejiaxiaobao/Library/Application Support/typora-user-images/image-20230113212918686.png)]

详细图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q8uInd2y-1673618806605)(/Users/tiejiaxiaobao/Library/Application Support/typora-user-images/image-20230113203153023.png)]

🌲 常见面试题

1、对象在JVM中是如何存储的呢?

2、对象头信息里面有哪些东西?

3、Java对象头中有什么?

答案参考:

地址

3、对象访问定位

首先我们要知道 JVM 是如何通过栈帧中的对象引用访问到其内部的对象实例的呢?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dt6168GG-1673618806605)(/Users/tiejiaxiaobao/Library/Application Support/typora-user-images/image-20230113214628427.png)]

我们的 Java 程序会通过栈上的 reference 数据来操作堆上的具体对象。由于 reference 类型在 《Java虚拟机规范》 里面只规定了它是一个指向对象的引用,并没有定义这个引用应该通过什么方式去定位、访问到堆中对象的具体位置,所以对象访问方式也是由虚拟机实 现而定的,主流的访问方式主要有使用 句柄和直接 指针两种。

3.1 句柄指针

·如果使用句柄访问的话,Java 堆中将可能会划分出一块内存来作为句柄池,reference 中存储的就 是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自具体的地址信息,其结构如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-COTm6Qum-1673618806605)(/Users/tiejiaxiaobao/Library/Application Support/typora-user-images/image-20230113214928852.png)]

优点:

使用句柄来访问的最大好处就是 reference 中存储的是稳定句柄地 址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而 reference 本身不需要被修改。

3.2 直接指针

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cuQSbyXZ-1673618806606)(/Users/tiejiaxiaobao/Library/Application Support/typora-user-images/image-20230113215128591.png)]

优点:

使用直接指针来访问最大的好处就是速度更快,它节省了一次指针定位的时间开销,由于对象访 问在Java中非常频繁,因此这类开销积少成多也是一项极为可观的执行成本。

⚠️ 注意: HotSpot 使用的是直接指针访问。

相关内容

热门资讯

你的晚安是我的早安是什么歌曲 你的晚安是我的早安是什么歌曲苏天伦《你的早安是我的晚安》“你的晚安是我的早安”是单小源的歌曲《东京遇...
积极进取的小故事 积极进取的小故事现代的普通人,不要名人的。不能与别人重复,尽快回答   啄木鸟的故事       啄...
熊出没之探险日记3什么时候播出... 熊出没之探险日记3什么时候播出?熊出没之探险日记3,春节前播放。熊出没只是探险日记三2020年5月4...
谁知道所有有关“七”的歌?拜托... 谁知道所有有关“七”的歌?拜托了各位 谢谢就是歌曲名里有“七”这个字的!谢谢七月七迅谈日晴 看我七十...
求一本小说 女主穿越了三次 每... 求一本小说 女主穿越了三次 每次都在福临身边 后来怀孕了孩子被打掉了那个 女主叫什么雯?那个女主就是...
如果记忆不说话,流年也会开出花... 如果记忆不说话,流年也会开出花的基本信息书 名:《如果记忆不弯饥好说话,流年也会开出花》埋铅 作 者...
你好,旧时光漫画版在哪里可以看... 你好,旧时光漫画版在哪里可以看?暂时在绘心上连载
一首英文歌,男的组合唱的,MV... 一首英文歌,男的组合唱的,MV是一个婚礼的过程。求歌名。是不是darin的can'tstoplove...
为什么很多人喜欢用胶片相机? 为什么很多人喜欢用胶片相机?有一种情怀叫做“怀旧“吧,现在数码相机越来越普遍了,已经到了”全民摄影“...
女主先爱上男主,男主却不喜欢女... 女主先爱上男主,男主却不喜欢女主或者是另有所爱,最后女主男主还是在一起的穿越小说。有木有再生缘:我的...
爱情失恋伤感句子 爱情失恋伤感句子越是美好的从前,越幸福的曾经,现在只能带来锥心的疼痛,痛到撕心裂肺,肝肠寸断,终于痛...
24岁穿这个会不会显老 24岁穿这个会不会显老有点显老,这个颜色款式,颜色有点暗,没有活力,属于那种气质佳,长得高雅的女人,...
哈尔的移动城堡英语版 哈尔的移动城堡英语版可以发给我吗度盘~请查收~
秦时明月之万里长城什么时候播 秦时明月之万里长城什么时候播据说是今年暑假开播别急,官网什么的信他你就输了,12年之前底应该会出,杭...
孩子会得抽动症吗? 孩子会得抽动症吗?我天生的气性比较大,有时跟别人斗嘴时候就会手脚哆嗦,麻木,我问一下这是不是抽动症就...
亨德尔一生为音乐献出了怎样的贡... 亨德尔一生为音乐献出了怎样的贡献?亨德尔一生写了歌剧41部,清唱剧21部,以及大量的管乐器与弦乐器的...
礼仪起源和发展的经典故事? 礼仪起源和发展的经典故事?一、礼仪的起源;1、天神生礼仪;2、礼为天地人的统一体;3、礼产生于人的自...
描写桂林山水的句子有哪些? 描写桂林山水的句子有哪些?天下风光数桂林有杨万里的“梅花五岭八桂林,青罗带绕碧玉簪”;有邹应龙的“无...
避免与强敌正面对决的成语 避免与强敌正面对决的成语避免与强敌正面对决的成语避实就虚 【近义】避重就轻、避难就易、声东击西【反义...
多愁善感类的成语 多愁善感类的成语心细如发【解释】:极言小心谨慎,考虑周密。亦作“心细于发”。【出自】:吴梅《题天香石...