当前位置: 首页 > news >正文

java对象的内存分配

1.类加载检查

JVM接收new指令时,首先检查该指令的参数能否在常量池中定位到一个类的符号引用,并检查该符号引用代表的类是否已加载、解析和初始化。若未加载,需先执行类加载过程。

2.内存分配

对象所需内存大小在类加载完成后便可确定,内存的分配方式取决于java堆是否规整,针对规整的内存JVM默认采用指针碰撞方式分配内存,不规整内存则采用空闲列表方式分配内存。

  • 指针碰撞(Bump the Pointer):如果Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离。该方法适用于内存规整的垃圾收集器(如Serial、ParNew)。其特点是通过移动指针来分配内存,简单高效
  • 空闲列表(Free List):,虚拟机就维护一个列表,记录哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录。该方法适用于内存不规整的垃圾收集器(如CMS)。其特点是通过维护空闲内存块列表来分配内存,开销较大。

无论采用指针碰撞还是空闲列表,都会产生内存分配的并发问题,针对该问题,JVM提供一下两种方式来保证内存分配的线程安全:

  • CAS(compare and swap)+失败重试:通过CAS+失败重试机制实现同步内存分配,G1、Shenandoah收集器均采用此方法完成内存分配
  • 本地线程分配缓冲(Thread Local Allocation Buffer,TLAB):为每个线程预先在堆中分配一小块私有内存(默认占Eden区的1%),分配时无需锁定,可大幅提高分配效率。可通过-XX:+/-UseTLAB参数控制,通过-XX:TLABSize 指定TLAB大小。

内存分配的位置默认在堆区的Eden区,除了以下两种情况:

  • jvm是否开启逃逸分析和标量替换,若jvm开启逃逸分析(-XX:+DoEscapeAnalysis)和标量替换((-XX:+EliminateAllocations),且当前对象未逃逸的情况下JIT将会在栈上分配空间存储对象,同时将其成员变量拆解为基本类型(标量),直接存储于栈中;这样做的优势是对象会随栈帧出栈而自动销毁,不参与GC过程,减少GC压力
  • 对象的大小是否符合JVM的大对象定义,若对象大小符合大对象定义,则对象会直接进入老年代

3.内存空间初始化

JVM将分配的内存空间初始化为零值(不包括对象头)。若使用TLAB,该操作可提前至TLAB分配时进行

4.设置对象头

将当前对象的哈希码、GC分代年龄、锁标识、元数据指针等放入对象头中。对象头结构为:

  • Mark Word(8字节):哈希码、锁状态等。
  • 类型指针(4/8字节):指向类元数据。
  • 数组长度(仅数组对象有,4字节)。

5.执行<init>方法

执行<init>方法,为属性赋值和执行构造方法

最后需要说明对象分配内存的操作默认情况下在64位的系统中开启了指针压缩功能,这样做的目的是为了减少64位平台下内存的消耗。

http://www.dtcms.com/a/309126.html

相关文章:

  • linux编译基础知识-工具链
  • datagrip连接mysql数据库过程以及遇到的问题
  • Linux网络:多路转接 epoll
  • 深入讲讲异步FIFO
  • Blender 4.5 安装指南:快速配置中文版,适用于Win/mac/Linux系统
  • 汽车EDI:Vitesco EDI 项目案例
  • 基于单片机汽车少儿安全预警系统
  • 【世纪龙科技】汽车整车维护仿真教学软件-智构整车维护实训
  • Oracle EBS ERP开发 — 抛出异常EXCEPTION书写规范
  • 【世纪龙科技】3D交互深度赋能-汽车整车维护仿真教学软件
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现道路汽车的检测识别(C#代码,UI界面版)
  • Apache RocketMQ for AI 战略升级,开启 AI MQ 新时代
  • GXP6040K压力传感器可应用于医疗/汽车/家电
  • 在SQL SERVER 中,用SSMS 实现存储过程的每日自动调用
  • 嵌入式系统教学范式演进:云端仿真平台如何重构温湿度监测实验教学
  • Web开发-PHP应用弱类型脆弱Hash加密Bool类型Array数组函数转换比较
  • 动态规划 Dynamic programming
  • 渗透作业3
  • Kafka Streams 并行处理机制深度解析:任务(Task)与流线程(Stream Threads)的协同设计
  • kafka快速部署、集成、调优
  • 超越 ChatGPT:智能体崛起,开启全自主 AI 时代
  • 中英混合的语音识别XPhoneBERT 监督的音频到音素的编码器结合 f0 特征LID
  • 阿里云微服务引擎 MSE 及 API 网关 2025 年 7 月产品动态
  • 单变量单步时序预测:CNN-LSTM卷积神经网络结合长短期记忆神经网络
  • MybatisPlus如何用wrapper语句灵活连接多查询条件
  • SpringBoot+LangChain4j解析pdf文档,不使用默认解析器
  • 解决VScode加载慢、保存慢,git加载慢,windows11系统最近异常卡顿的问题
  • 高端房产管理小程序
  • 【Ubuntu】安装使用pyenv - Python版本管理
  • ORACLE函数