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.hqwc.cn/news/599190.html

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

相关文章

前端:SVG绘制流程图

效果 代码 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>SVG流程图示例</title><style>/* CSS 样式 */</style><script src"js/index.js"></script…

自然语言处理技术(Natural Language Processing)知识点

自然语言处理知识点 自然语言处理1. word2vec是什么2. 常用的NLP工具和软件3. 朴素贝叶斯分类器4. BiLSTM-CRF模型怎么去实现5. Bert模型实现NER6. 命名实体识别任务中&#xff0c;怎么去处理数据分布不均的问题&#xff1f;7. 用户问题检索相关文本时&#xff0c;具体都用了哪…

【CicadaPlayer】demuxer_service的简单理解

G:\CDN\all_players\CicadaPlayer-github-0.44\mediaPlayer\SMPMessageControllerListener.cppplayer的demuxer服务类 std::unique_ptr<demuxer_service> mDemuxerService{nullptr};根据option (Cicada::options),可以决定音视频的不同操作,通过 hander可以获得具体使…

论文笔记:Detecting Pretraining Data from Large Language Models

iclr 2024 reviewer评分 5688 1 intro 论文考虑的问题&#xff1a;给定一段文本和对一个黑盒语言模型的访问权限&#xff0c;在不知道其预训练数据的情况下&#xff0c;能否判断该模型是否在这段文本上进行了预训练 这个问题是成员推断攻击(Membership Inference Attacks&…

【学习笔记】3、逻辑门电路

3.1 MOS逻辑门电路 按照器件结构的不同形式&#xff0c;分为NMOS、PMOS、CMOS三种逻辑门电路。 3.1.1 CMOS CMOS电路成为主导地位的逻辑器件。工作速度&#xff1a;赶上甚至超过TTL电路。&#xff08;早期CMOS速度慢&#xff0c;后来工艺提升速度变快&#xff09;功耗和抗干…

2024年C语言最新经典面试题汇总(21-30)

C语言文章更新目录 C语言学习资源汇总&#xff0c;史上最全面总结&#xff0c;没有之一 C/C学习资源&#xff08;百度云盘链接&#xff09; 计算机二级资料&#xff08;过级专用&#xff09; C语言学习路线&#xff08;从入门到实战&#xff09; 编写C语言程序的7个步骤和编程…

JetBrains IDE 2024.1 发布 - 开发者工具

JetBrains IDE 2024.1 (macOS, Linux, Windows) - 开发者工具 CLion, DataGrip, DataSpell, Fleet, GoLand, IntelliJ IDEA, PhpStorm, PyCharm, Rider, RubyMine, WebStorm 请访问原文链接&#xff1a;JetBrains IDE 2024.1 (macOS, Linux, Windows) - 开发者工具&#xff0…

计算机视觉——基于深度学习检测监控视频发生异常事件的算法实现

1. 简介 视频异常检测&#xff08;VAD&#xff09;是一门旨在自动化监控视频分析的技术&#xff0c;其核心目标是利用计算机视觉系统来监测监控摄像头的画面&#xff0c;并自动检测其中的异常或非常规活动。随着监控摄像头在各种场合的广泛应用&#xff0c;人工监视已经变得不…

三防笔记本丨工业笔记本电脑丨助力测绘行业的数字化转型

测绘行业测绘行业一直是高度技术化的领域&#xff0c;其重要性在于为建设、规划和资源管理提供准确的地理数据。然而&#xff0c;随着技术的发展&#xff0c;传统的测绘方法已经难以满足对数据精度和实时性的要求。因此&#xff0c;测绘行业正逐渐向数字化转型&#xff0c;采用…

ctfshow web入门 php特性 web140--web150plus

web140 这里用松散比较的漏洞绕过 0和字符串比较的时候就是true $code eval("return $f1($f2());"); 等于0就可以传参 POST: f1intval&f2intval查看源码 web141 if(preg_match(/^\W$/, $v3)) 是一段 PHP 代码&#xff0c;它使用了正则表达式函数 preg_mat…

node相关

文章目录 nodeJS是什么&#xff1f;优缺点使用场景全局对象适合用于构建 I/O 密集型不适用于计算密集型任务 nodeJS是什么&#xff1f; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境&#xff0c;它是跨平台和开源的。 Node.js 使用高效、轻量级的事件驱动、非阻…

性能分析-CPU知识

目录 CPU知识 cpu组成 查看cpu信息&#xff1a; top命令中 cpu相关&#xff1a; top命令看到系统负载&#xff1a; CPU负载 IO负载 上下文&#xff1a; CPU的寄存器和程序计数器----在cpu的控制器中 实战演示分析 top命令分析 arthas工具 进程上下文切换高的问题分析…