JVM—对象的创建流程与内存分配

JVM—对象的创建流程与内存分配

创建流程

对象创建的流程图如下:

对象的创建流程图

对象的内存分配方式

内存分配的方式有两种:

  • 指针碰撞(Bump the Pointer)
  • 空闲列表(Free List)
分配方式说明收集器
指针碰撞(Bump the Pointer)内存地址是连续的(新生代)Serial和ParNew收集器
空闲列表(Free List)内存地址不连续(老年代)CMS收集器和Mark-Sweep收集器

内存分配方式1

内存分配方式2

指针碰撞

指针碰撞示意图如下:

指针碰撞示意图

内存分配安全问题:

虚拟机给A线程分配内存的过程中,指针未修改,此时B线程同时使用了该内存,就会出现问题。

解决方式:

  • CAS乐观锁:JVM虚拟机采用CAS失败重试的方式保证更新操作的原子性;
  • TLAB (Thread Local Allocation Buffer)本地线程分配缓存,预分配。
分配主流程

首先从TLAB里面分配,如果分配不到,再使用CAS从堆里面划分。

对象如何进入老年代

对象进入老年代流程如下:

对象如何进入老年代

  • 新对象大多数默认都进入Eden;

  • 对象进入老年代的四种情况:

    • 年龄太大 MinorGC15次-XX:MaxTenuringThreshold】;

    • 动态年龄判断:MinorGC后会动态判断年龄,将符合要求对象移入老年代;

      MinorGC之后,发现Survivor区中的一批对象的总大小大于了这块Survivor区的50%,那么就会将此时大于等于这批对象年龄最大值的所有对象,直接进入老年代。

      例子: Survivor区中有一批对象,年龄分别为年龄1+年龄2+年龄n的多个对象,对象总和大小超过了Survivor区域的50%,此时就会把年龄n及以上的对象都放入老年代。希望那些可能是长期存活的对象,尽早进入老年代。
      比率可以由-XX:TargetsurvivorRatio指定
      
    • 大对象直接进入老年代1M【-XX:PretenureSizeThreshold 】;(前提是Serial和ParNew收集器)

      为了避免大对象分配内存时的复制操作降低效率。

      避免了Eden和Survivor区的复制。

    • MinorGC后存活对象太多无法放入Survivor。

空间担保机制

空间担保机制:当新生代无法分配内存的时候,我们想把新生代的老对象转移到老年代,然后把新对象放入腾空的新生代。此种机制我们称之为内存担保。

空间担保流程图如下:

空间担保流程图

对象内存布局

对象内存布局示意图如下:

对象内存布局

对象里的三个区

堆内存中,一个对象在内存中存储的布局可以分为三块区域:

堆内存中,一个对象在内存中存储的布局可以分为三块区域:

  • 对象头(Header) : Java对象头占8byte。如果是数组则占12byte。因为JVM里数组size需要使用4byte存储。

    • 标记字段MarkWord:

      • 用于存储对象自身的运行时数据,它是synchronized实现轻量级锁和偏向锁的关键。

      • 默认存储:对象HashCode、GC分代年龄、锁状态等等信息。

      • 为了节省空间,也会随着锁标志位的变化,存储数据发生变化。

        锁标志位的变化

    • 类型指针KlassPoint:

      • 是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例
      • 开启指针压缩存储空间4byte,不开启8byte。
      • JDK1.6+默认开启
    • 数组长度:如果对象是数组,则记录数组长度,占4个byte,如果对象不是数组则不存在。

    • 对齐填充:保证数组的大小永远是8byte的整数倍。

  • 实例数据(Instance Data):生成对象的时候,对象的非静态成员变量也会存入堆空间

  • 对齐填充(Padding) :JVM内对象都采用8byte对齐,不够8byte的会自动补齐。

如何访问一个对象

有两种方式:

  1. 句柄:稳定,对象被移动只要修改句柄中的地址

  2. 直接指针:访问速度快,节省了一次指针定位的开销

句柄方式访问对象

通过直接指针访问对象

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三防笔记本丨加固笔记本丨三防笔记本电脑赋能车辆检修

随着汽车数量的不断增加和交通运输行业的发展,车辆检修行业成为了保障交通安全和延长车辆寿命的重要领域。在车辆检修过程中,需要使用各种工具和设备来进行检测、维修和保养,而信息化技术的应用正逐渐渗透到这一行业中,为检修工作…

51单片机实验03-定时器T0来实现流水灯从左到右再从右到左

目录 一、实验目的 二、实验说明 1、51单片机有两个16位内部计数器/定时器(C/T, Counter/Timer)。 2、模式寄存器TMOD 1) M1M0工作模式控制位; 2) C/T定时器或计数器选择位: 3)GATE定时器/计数器运行…

超声波清洗机哪家强?超声波清洗机排行榜!最强超声波清洗机推荐

眼镜作为日常生活中不可或缺的用品,对于很多人来说是必备的。然而,随着使用时间的增长,眼镜表面往往会沾染灰尘、污垢等,这不仅影响了镜片的透光性,也可能影响到使用者的视力和舒适度。因此,清洁眼镜成了一…

2_6.Linux高级存储管理

##1.逻辑卷## pv ##物理卷 被处理过的物理分区 pe ##物理扩展 设定存储最小单元 vg ##物理卷组 捆绑pv到一个组中 lv ##逻辑卷 分配最终的使用设备 监控建立过程: watch -n 1 "pvs;echo ;vgs;echo ;lvs;echo ;df -h /weixindata" (1&#xf…

wheeltec轮趣ROS教育机器人的网络连接

一、术语解析 宿主机:宿主机是指物理主机,比如用于开发测试的笔记本电脑和台式机电脑。 虚拟机:虚拟机是指安装在宿主机的VMware,推荐在宿主机上安装虚拟机,官方提供虚拟机的镜像以及配套的开发环境。 ROS主机&…

DC/DC1A30V高效同步降压转换器H4010

DC/DC 1A30V高效同步降压转换器是一种高频、同步、整流、降压、开关模式转换器,内置功率MOSFET。它可以在宽输入电源范围内实现1.5A峰值输出电流,并具有出色的负载和线路调节性能。此外,该转换器需要最少数量的现成外部元件,并采用…

微信聊天记录恢复只需简单3招,快速找回聊天内容!

各种社交软件早已深深融入我们的日常生活,无论是与亲朋好友的闲聊,还是与同事伙伴的工作沟通,都离不开它们的陪伴。然而,有时由于误操作、系统更新或手机故障等原因,我们可能会不小心删除了重要的聊天记录,…

PCI总线学习笔记:读写篇

前言 最近在写E1000网卡的驱动,这其中涉及到了PCI总线的相关内容。但是网上大部分关于PCI的文章都只局限在概念上的描述,并没有给出具体的例子来解释。这其实也是情理之中的,因为PCI总线规范就像是一个抽象的接口,其具体怎么实现…

C语言之自定义类型联合和枚举

目录 前言 一:联合体(共用体)union 1.联合体类型的声明 2.联合体的特点 3.联合体大小的计算 4.联合体判断机器的大小端 二:枚举enum 1.概念 2.枚举的优点 3.枚举的使用 接下来的日子会顺顺利利,万事胜意…

C++ 类和对象(中篇)

类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情 况下,都会自动生成下面6个默认成员函数。 构造函数: 定义:构造函数是一个特殊的成员…

【C语言】猜数字小游戏(并讲解随机数相关知识)

前言 一、游戏菜单 二、游戏逻辑 1.用户选择 2.开始游戏 2.1 生成1~100的随机数 总结 前言 本文讲解使用C语言写一个猜数字小游戏(1~100),涉及到的语法为:循环、分支、随机数、函数 一、游戏菜单 一个游戏的最开始,往往是一个菜单&…

Jetpack Bluetooth——更优雅地使用蓝牙

Jetpack Bluetooth——更优雅地使用蓝牙 蓝牙是安卓开发中非常常用的操作,但安卓经过这么多年的迭代,蓝牙的相关接口都经过了很多修改需要适配,还有的接口需要实现一堆函数。。。整套操作虽说不算复杂,但难免感觉不太舒服。 之前…

专题【双指针】【学习题】刷题日记

题目列表 11. 盛最多水的容器 42. 接雨水 15. 三数之和 16. 最接近的三数之和 18. 四数之和 26. 删除有序数组中的重复项 27. 移除元素 75. 颜色分类 167. 两数之和 II - 输入有序数组 2024.04.06 11. 盛最多水的容器 题目 给定一个长度为 n 的整数数组 height 。有 n 条垂…

PHP实现网站微信扫码关注公众号后自动注册登陆实现方法及代码【关注收藏】

在网站注册登陆这环节,增加微信扫码注册登陆,普通的方法需要开通微信开发者平台,生成二维码扫码后才能获取用户的uinonid或openid,实现注册登陆,但这样比较麻烦还要企业认证交费开发者平台,而且没有和公众号…

【SQL】1890. 2020年最后一次登录(简单写法;窗口函数写法)

前述 sql 中 between 的边界问题 ---- between 边界:闭区间,not between 边界:开区间 在 sql 中, between 边界:闭区间not between 边界:开区间 题目描述 leetcode题目:1890. 2020年最后一…

【leetcode面试经典150题】16.接雨水(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…

aardio教程五) 写Python风格的aardio代码(字符串篇)

前言 熟悉一个新的语言最麻烦的就是需要了解一些库的使用,特别是基础库的使用。 所以我想给aardio封装一个Python风格的库,Python里的基础库是什么方法名,aardio里也封装同样的方法名。 这样就不需要单独去了解aardio里一些方法的使用细节…

Lanelets_ 高效的自动驾驶地图表达方式

Lanelets: 高效的自动驾驶地图表达方式 附赠自动驾驶学习资料和量产经验:链接 LaneLets是自动驾驶领域高精度地图的一种高效表达方式,它以彼此相互连接的LaneLets来描述自动驾驶可行驶区域,不仅可以表达车道几何,也可以完整表述车…

AIGC实战——ProGAN(Progressive Growing Generative Adversarial Network)

AIGC实战——ProGAN 0. 前言1. ProGAN2. 渐进式训练3. 其他技术3.1 小批标准差3.2 均等学习率3.3 逐像素归一化 4. 图像生成小结系列链接 0. 前言 我们已经学习了使用生成对抗网络 (Generative Adversarial Network, GAN) 解决各种图像生成任务。GAN 的模型架构和训练过程具有…

真实的招生办对话邮件及美国高校官网更新的反 AI 政策

这两年 ChatGPT 的热度水涨船高,其编写功能强大,且具备强大的信息整合效果,所以呈现的内容在一定程度上具备可读性。 那么,美国留学文书可以用 ChatGPT 写吗?使用是否有风险?外网博主 Kushi Uppu 在这个申…