面试题:JVM在Java堆中对对象的创建、内存结构、访问方式

JVM 内存结构基于JDK1.8【JVM篇三】 在我的上一篇文章别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】中,相信大家已经对java类加载机制有一个比较全面的理解了,那么类加载之后,字节码数据在 Java 虚拟机内存中是如何存放的 ?Java 虚拟机在为类实例或成员变量分配内存是如何分配的 ?是的,这两个问题就涉及到了JVM 内存结构的知识了,那么这篇文章将进行解答。 文章目录1、内存结构还... 阅读详情

大家好,我是Java大蜗牛,一个渴望在互联网行业做到很牛的蜗牛。

可柔可刚,点赞则柔,白嫖则刚!死鬼~~~看完记得给我来个三连哦!

面试题:JVM在Java堆中对对象的创建、内存结构、访问方式

一、对象创建过程

面试题:JVM在Java堆中对对象的创建、内存结构、访问方式

1、检查类是否已被加载

JVM遇到new指令时,首先会去检查这个指令参数能否在常量池中定位到这个类的符号引用,检查这个符号引用代表的类是否已被加载、解析、初始化,若没有,则进行类加载

2、为新对象分配内存

类加载检查后,JVM为新对象在堆内存中分配空间,内存大小在类加载完成后便可确定。内存分配方式有以下几种:

1)指针碰撞(Bump the Pointer):若堆内存规整的,已用的和空闲的各占一边,分配内存就是把指针作为分界点,指针往空闲的一边移动对象大小的空间。

2)空闲列表(Free List):若堆内存不规整,JVM必须维护一个记录可用内存块的列表,分配内存时,把列表中一块空间分配给对象,并更新表记录。

以上两种在并发情况下,存在线程安全问题,在给对象A分配内存时,指针还没来得及修改,对象B又同时使用原来的指针来分配内存。解决方案有两种:

1)给分配内存的动作同步处理:JVM使用CAS+失败重试,保证更新操作的原子性。

2)本地线程分配缓冲(TLAB Thread Local Allocation Buffer):给每个线程在堆内存中预先分配已小块内存,在需要分配内存的线程的TLAB上分配,TLAB用完并分配新的TLAB时,才同步锁定。JVM通过设置 -XX:+UseTLAB来开启。

3、将分配到的内存都初始化为零值(不含对象头)

保证了对象的实例字段在java代码中不赋初始值就可以直接使用。如果使用TLAB,这一步可提前到TLAB分配时进行。

4、对对象进行其他必要的设置

如设置对象头的内容

5、执行java代码中<init>方法进行初始化

以上4步完成后,对于JVM来说,新的对象已经产生了,但是对于java程序来说,对象才刚刚开始创建。

二、对象的内存结构

面试题:JVM在Java堆中对对象的创建、内存结构、访问方式

1、对象头

1.1 标识字段 Mark Work

用于存储对象自身的运行时数据,如HashCode,GC分代年龄,锁状态标志等

1.2 类型指针 Klass Pointer

对象指向它的类型元数据的指针,JVM通过这个指针确定该对象属于哪个类的实例

如果对象是一个数组,对象头中还要有一块用于记录数组长度的数据,因为数组长度是不确定的,无法通过元数据中的信息推断数组大小。

面试题:JVM在Java堆中对对象的创建、内存结构、访问方式

2、实例数据

对象实际存储的有效信息,即代码中定义的字段和父类继承下来的,存储顺序受到JVM分配策略参数(-XX:FieldAllocationStyle)和代码中字段定义顺序影响

3、对齐填充

不是必然存在,仅仅是起占位符作用;由于HotSpot虚拟机的自动内存管理系统要求任何对象大小都必须是8字节的整数倍,对象头被设计成正好是8字节的整数倍,因此实例数据部分没有对齐8字节的整数倍的话,就通过对齐填充来补全。

三、对象的访问方式

面试题:JVM在Java堆中对对象的创建、内存结构、访问方式

java程序是通过java栈中的reference数据来操作堆中的具体对象

1、句柄访问

java堆中划分一块内存作为句柄池,栈上的reference存的是对象的句柄地址,句柄池中包含对象实例数据和类型数据的地址信息。

优点:垃圾收集移动对象时,只改变句柄中实例数据指针,而reference本身不需要修改。

面试题:JVM在Java堆中对对象的创建、内存结构、访问方式

2、直接访问

直接指针访问,reference存的直接是对象的地址。不需要多一次间接访问的开销。

优点:速度快,节省一次指针定位的时间开销。

HotSpot虚拟机主要使用直接访问进行对象访问。

面试题:JVM在Java堆中对对象的创建、内存结构、访问方式

点击此处【链接】可免费领取一份(Java学习视频,技术文档,电子书籍,面试等资料...)

Python爬虫实战:逆向解析腾讯视频API,高效获取结构化视频信息 首先,我们定义期望获取的数据结构,这有助于数据验证和代码清晰度。python"""腾讯视频信息数据模型"""title: str = Field(..., description="视频标题")vid: str = Field(..., description="视频唯一ID")play_count: Optional[int] = Field(None, description="播放量") 阅读详情

相关推荐

RK3588 C-PHY摄像头驱动升级踩坑记:从‘Only CSI2 supported’报错到成功取流

本文详细记录了在RK3588平台上调试C-PHY摄像头驱动的全过程,从‘Only CSI2 supported’报错分析到成功取流。内容涵盖C-PHY与CSI-2协议差异、SDK版本对比、V4L2框架下的bus-type解析机制,以及硬件排查与寄存器调优实战经验,为嵌入式Camera驱动工程师提供宝贵参考。

weixin_42522374的博客 122

java代码内存_Java程序在内存中运行详解

Java语言是一门编译型语言,需要将编写的源代码(.java文件)编译之后(.class字节码文件),通过 jvm 才能正常的执行,下面的内容记录了一个程序从编写到执行整个过程在内存中是怎么一个变的。一、JVM的内存分布先了解下 JVM 的内存分布,因为Java程序想要运行,就要依靠 JVM,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM 实现了Java 的平台无关性,由此可见JVM的...

weixin_32083393的博客 550

Linux CentOS 8系统离线升级内核版本

CentOS 8操作系统离线场景下升级内核版本

WQwinter的博客 3237

JVM面试题详解系列——Java 对象的创建过程

JVM面试题详解系列——Java 对象的创建过程

m0_51431003的博客 3175

方法二:旋转机械动平衡精度计算

本文以实际案例为基础,系统阐述基于ISO 1940标准的动平衡精度G GG等级计算方法。通过角速度转换、许用剩余不平衡量e p e r e_{per}e per ​ 推导及G GG等级公式应用,结合惯性力偶矩、转子质量等参数,得出某转子系统的动平衡精度为G 40 G40G40。文中详细解析了公式原理与参数单位转换要点,并附完整ISO 1940动平衡等级参考表,为工程师提供从理论到实践的完整解决方案。研究结果表明,该方法可有效量化旋转机械的平衡精度,适用于风机、泵类等中低速设备的设计与调试,对提升设备运行

weixin_46153372的博客 920

基于大模型的恶性胸腔积液全周期预测与诊疗方案研究

本研究基于大模型技术构建了恶性胸腔积液全流程预测与诊疗体系,涵盖术前风险评估、术中方案优化、术后恢复预测及并发症预防。通过整合多源医疗数据,实现了手术风险概率预测(准确率80%)、并发症预警(AUC值0.85)及个性化康复方案制定,显著提升诊疗精准度。研究创新性地将Transformer架构与多模态数据融合,在100例临床验证中显示良好性能,但存在数据样本局限、模型可解释性不足等问题。未来将扩大多中心临床验证,优化算法可解释性,探索与基因检测等技术的结合应用,推动恶性胸腔积液的精准诊疗发展。

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1897

面试官问你Java内存区域你用new创建对象来解释

这几天研究Java虚拟机(Java Virtual Machine),不得不说,这玩意真牛掰,Java跨平台真不是盖的,JVM的学习,今天就从内存区域开始,Java虚拟机他有自己管理的一块内存区域,并且把这块区域分成了若干个小区域,来一张图,先看看葫芦里装的都是啥 程序计数器 这五块区域,我们逐个进行击破,先来第一个程序计数器,听这家伙的名字都能大致猜出来他是干啥的,计数的呗,给谁计数呀,给程序...

1709

Qwen-Image LoRA训练实战:从数据准备到异常修复的全流程解析

本文详细解析了Qwen-Image LoRA训练的全流程,从数据准备到参数优化再到异常修复。通过实战案例展示了如何利用LoRA技术微调Qwen-Image模型,提升中文场景下的图像生成质量,特别针对手脚生成异常等问题提供了有效解决方案。文章还分享了中文提示词优化技巧和高级训练方法,帮助开发者高效训练出高质量的LoRA模型。

lemon的博客 965

【每日面试】Java关于内存的面试问题(1)

Java中提到跟内存相关的问题,就会想到JVM,而JVM的东西又很繁多,有些还不简单。内容这个问题,这次就好好梳理一下,把所有相关的内容都了解一下,对这些内容做出分类,再从中确定面试热点和实战热点,这样总揽全局,有所取舍,以后再遇到这个问题,就不会头疼了。(这个内容比较多,所以分次完成) 1. 关于内存的问题都有哪些?我手里有两份PDF,是近些年面试题的汇总,先从这里面找,然后再百度,再去牛客网搜索,再无知乎,差不多了。 汇总一下问题: 1)解释内存中的栈(stack)、堆(heap...

传播技术之光 461

浏览器主页被2345劫持简单处理方法

本人比较常用的浏览器是IE和Chrome IE: 将网址修改为https://www.baidu.com 应用-确定-重新打开IE浏览器 或者win+r运行regedit打开注册表找到这个值   HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main下  和HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Main这个下面的StartPage ...

A soul tortured by desire 2万+

BACnet协议栈基本对象BI、BO、AI、AO、AV以及device和File对象介绍

BACnet协议栈基本对象BI、BO、AI、AO、AV以及device和File对象介绍

shufawangzhang的博客 3985

JVM面试(三)-对象的创建、为对象分配内存、对象的内存布局、对象访问定位

如果Java堆的内存是规整,即所有用过的内存放在一边,而空闲的的放在另一边 分配内存时 将 位于中间的指针指示器 向空闲的内存移动一段 与 对象大小相等的距离,这样便完成分配内存工作如果Java堆的内存不是规整的,则需要 由虚拟机 维护一个列表 来记录 那些内存是可用的,这样在分配的时候 可以从列表中 查询到 足够大的内存分配给对象,并在分配后更新列表记录选择哪种分配方式是由 Java 堆是否规整来决定的,而 Java 堆是否规整 又由 所采用的 垃圾收集器 是否 带有压缩整理功能决定对象的创建在虚拟机中是

星光之子的博客 482

2024届数字IC秋招-华为机试-数字芯片-笔试真题和答案(五)(含2022年和2023年)

此部分包含华为机试真题,方向是数字芯片,内容详细包括设计、验证、后端等,大部分题目给出参考答案。华为机试都是从题库里抽题目,所以这些题目还是很有参考性的,甚至是完全一样,可以搜到的。(题目内容较多,将分开编写几个文章)

qq_42135020的博客 2081

常问面试题:JVM在Java堆中对对象的创建、内存结构、访问方式

大家好,我是Java大蜗牛,一个渴望在互联网行业做到很牛的蜗牛。 可柔可刚,点赞则柔,白嫖则刚! 死鬼~~~看完记得给我来个三连哦! 一、对象创建过程 1、检查类是否已被加载 JVM遇到new指令时,首先会去检查这个指令参数能否在常量池中定位到这个类的符号引用,检查这个符号引用代表的类是否已被加载、解析、初始化,若没有,则进行类加载 2、为新对象分配内存 类加载检查后,JVM为新对象在堆内存中分配空间,内存大小在类加载完成后便可确定。内存分配方式有以下几种: 1)指针碰撞..

331

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java堆中句柄池_面试题:JVM在Java堆中对对象的创建、内存结构、访问方式

一、对象创建过程1、检查类是否已被加载JVM遇到new指令时,首先会去检查这个指令参数能否在常量池中定位到这个类的符号引用,检查这个符号引用代表的类是否已被加载、解析、初始化,若没有,则进行类加载2、为新对象分配内存类加载检查后,JVM为新对象在堆内存中分配空间,内存大小在类加载完成后便可确定。内存分配方式有以下几种:1)指针碰撞(Bump the Pointer):若堆内存规整的,已用的和空闲的...

weixin_30768403的博客 343

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

devexpress 创建窗口句柄时出错_面试题:JVM在Java堆中对对象的创建、内存结构、访问方式...

大家好,我是Java大蜗牛,一个渴望在互联网行业做到很牛的蜗牛。可柔可刚,点赞则柔,白嫖则刚!死鬼~~~看完记得给我来个三连哦!一、对象创建过程1、检查类是否已被加载JVM遇到new指令时,首先会去检查这个指令参数能否在常量池中定位到这个类的符号引用,检查这个符号引用代表的类是否已被加载、解析、初始化,若没有,则进行类加载2、为新对象分配内存类加载检查后,JVM为新对象在堆内存中分配空间,内存大小...

weixin_39642619的博客 120

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

这一次,终于系统的学习了 JVM 内存结构

最近在看《 JAVA并发编程实践 》这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课堂上,一直没有系统的学习这一块的知识,所以这一次我把《 深入理解Java虚拟机JVM高级特性与最佳实践 》、《 Java虚拟机规范 Java SE 8版 》这两本书中关于 JVM 内存结构的部分都看了一遍,算是...

平头哥的技术博文 7874

JVM的内存结构学习笔记

JVM的内存结构学习笔记

sjhhshsh的博客 942

深入解析Java JVM内存结构

本文详细解析了Java JVM内存结构,重点区分了内存模型与内存区域的核心概念。主要内容包括: JVM运行流程:从.java文件编译到类加载(双亲委派机制),再到内存分配过程 内存模型组成:线程私有的程序计数器、虚拟机栈、本地方法栈,以及共享的堆和方法区 关键区别: 方法区是逻辑概念,永久代/元空间是其实现 虚拟机栈存储Java方法栈帧,本地方法栈服务native方法 重要修正:澄清JDK 1.7后常量池存放位置的变化(永久代→堆) 其他组件:JNI接口、JIT编译器、垃圾收集器的作用 文章特别强调要避免网

小电玩 1671

Java面试-JVM 内存结构详解:堆、栈、方法区、程序计数器、本地方法栈

《Java面试200问:JVM内存结构深度解析》是一篇8000+字的干货文章,系统讲解了JVM五大内存区域。文章采用生动比喻将堆比作"共享客厅"、栈比作"私人日记"、方法区比作"家族档案馆"等,并配以详尽图示和代码示例(如对象创建、方法调用过程)。重点剖析了堆的分代结构(新生代/老年代)、栈帧组成、方法区与元空间的关系等核心概念,最后提供面试高频问题解析。全文通过幽默风趣的语言和直观图解,帮助读者深入理解JVM内存管理机制,提升面试竞争力。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

JVM内存结构的面试题

参考:https://juejin.im/post/5d4789afe51d453b386a62ac 问题: 1、JVM管理的内存结构是怎样的? 2、不同的虚拟机在实现运行时内存的时候有什么区别? 3、运行时数据区中哪些区域是线程共享的?哪些是独享的? 4、除了JVM运行时内存以外,还有什么区域可以用吗? 5、堆和栈的区别是什么? 6、Java中的数组是存储在堆上还是栈上的? 7、Java中的对象...

Virgil_K2017的博客 515

【JVM】Java对象结构

当我们在Java代码中,使用new创建一个对象的时候,JVM会创建一个instanceOopDesc对象,这个对象中包含了对象头、实例数据以及对齐填充。对象头信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机的空间效率,Mark Word被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。由于虚拟机要求对象的起始地址必须是8字节的倍数(在某些平台上要求更大),因此可能需要在对象的实例数据末尾添加额外的字节来对齐。

xueping_wu的博客 824

万万没想到,JVM内存结构的面试题可以问的这么难?

在我的博客中,之前有很多文章介绍过JVM内存结构,相信很多看多我文章的朋友对这部分知识都有一定的了解了。 那么,请大家尝试着回答一下以下问题: 1、JVM管理的内存结构是怎样的? 2、不同的虚拟机在实现运行时内存的时候有什么区别? 3、运行时数据区中哪些区域是线程共享的?哪些是独享的? 4、除了JVM运行时内存以外,还有什么区域可以用吗? 5、堆和栈的区别是什么? 6、Java中的数...

阿里云云栖号 1827

JVM内存的基本问题

(常见面试题可能的提问点)https://blog.youkuaiyun.com/GarfieldEr007/article/details/55822985 个人感觉学习JVM基本要点就是垃圾回收算法、垃圾回收原理、常见垃圾回收器、类加载机制、双亲委派模型、Java的逻辑分区,堆栈方法区啥的弄清楚。 个人相关博客:String类和常量池内存分析以及8种基本类型和常量池例子 读书笔记 介绍下 Java...

卓越无关环境,保持空杯心态——靡不有初,鲜克有终 1353

JVM01-堆、方法区、对象创建、执行引擎和StringTable

一、堆 概述 MinorGC、MajorGC和FullGC JVM在进行GC时,并非每次都对上面的三个内存(新生代、老年代;方法区)区域一起回收,大部分时候回收的都是 新生代。 针对 HotSpot VM 的实现,它里面的 GC 按照回收区域又分为两种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC) 部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为: 新生代收集(Minor GC / Young GC):只是新生代的垃圾收集 老年代收集(Major GC / O

weixin_40971059的博客 1234

JVM内存模型

JVM内存模型和面试题解析 目录 一、JVM运行时区域 1 程序计数器 2 Java 虚拟机栈 3 本地方法栈 4 堆 5 方法区 6 运行时常量池 7 直接内存 二、对象创建过程 1、类加载检查 2、分配内存 3、初始零值 4、设置对象头 5、执行init方法 三、对象的内存布局 四、对象的访问定位 五、String类和常量...

u011824378的博客 1032
上一篇: 淘宝一面:说一下 Spring Boot 自动装配原理呗?
下一篇: 速来围观!大佬把Java基础核心知识整理成了PDF版
java小望
博客等级 码龄5年 1粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值