JVM(Jvm如何管理空间?对象如何存储、管理?)

news2024/10/5 14:21:52

Jvm如何管理空间(Java运行时数据区域与分配空间的方式)

⭐运行时数据区域

![[Pasted image 20240419125849.png]]

程序计数器

程序计数器(PC),是一块较小的内存空。它可以看作是当前线程所执行的字节码的行号指示器。Java虚拟机的多线程是通过时间片轮转调度算法来实现的,线程切换后能恢复到正确的执行位置,此时需要程序计数器,各条线程之间计数器互不影响,也即PC是线程独享的。

如果正在执行的是一个Java方法,那么PC记录的就是虚拟机字节码的地址;如果是一个本地方法(Native方法),则PC的值为Undefined。

程序计数器是一个没有被规定任何OutOfMemoryError情况的区域

Java虚拟机栈

Java虚拟机栈也是线程独享,它的生命周期与线程相同。(其实可以理解为一个线程就是一个栈)

虚拟机栈是Java方法执行的线程内存模型:当方法被执行时,Java虚拟机就会同步生成有个栈帧(用于存储局部变量,操作数栈,动态链接,出口等),每一个方法从被调用到执行完毕就对应一个栈帧入栈和出栈的过程。栈帧中用于存储局部变量表、操作数栈、动态连接、方法出口等信息。

栈帧(参考链接):

  • 局部变量表:是用来存储我们临时8个基本数据类型、对象引用地址、returnAddress类型。(returnAddress中保存的是return后要执行的字节码的指令地址。)
  • 操作数栈:操作数栈就是用来操作的,例如代码中有个 i = 6*6,他在一开始的时候就会进行操作,读取我们的代码,进行计算后再放入局部变量表中去
  • 动态链接:假如我方法中,有个 service.add()方法,要链接到别的方法中去,这就是动态链接,存储链接的地方。
  • 出口:出口是什呢,出口正常的话就是return 不正常的话就是抛出异常落。
方法区

方法区是所有线程共享的内存区域,它用于存储已被Java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。它有个别命叫Non-Heap(非堆)。当方法区无法满足内存分配需求时,抛出OutOfMemoryError异常。

Java堆

Java堆是java虚拟机所管理的内存中最大的一块,是线程共享的,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例java堆是垃圾收集器管理的主要区域,因此也被成为“GC堆”

从内存回收角度来看java堆可分为:新生代和老生代。从内存分配的角度看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(TLAB)。无论是哪个区域,存储的都只能是对象的实例,将Java堆细分的目的只是为了更好地回收内存,或者更快地分配内存。如果在Java堆中没有内存完成实例分配,并且堆也无法再扩展时,Java虚拟机将会抛出OutOfMemoryError异常。

本地方法栈

他很栈很像,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务

⭐空间分配的方式

  • 指针碰撞法:假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”。
  • 空闲列表法:但如果Java堆中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为“空闲列表”。

⭐Jvm中的对象是如何存储、管理的?

对象组成

在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头、实例数据和对齐填充。

  • 对象头
    • Mark Word:Mark Word一个有着动态定义的数据结构,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。
    • 类型指针:即对象指向它的类型元数据的指针。
    • 数组长度:如果对象是一个Java数组,对象头中还必须有一块用于记录数组长度的数据
  • 实例数据:对象真正存储的有效信息
  • 对齐填充:这并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。由于在HotSpot虚拟机里任何对象的大小都必须是8字节的整数倍。如果对象实例数据部分没有对齐的话,就需要通过对齐填充来补全,来使得对象头是8字节的整数倍。

如何访问一个对象?

Java程序会通过栈上的reference数据来操作上的具体对象。主流的访问方式主要有使用句柄和直接指针两种。

句柄

使用句柄来访问的最大好处就是reference中存储的是稳定句柄地址,当对象被移动时,reference本身不需要被修改,只需要修改句柄池中的实例数据指针。
![[Pasted image 20240425165035.png]]

直接指针

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

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

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

相关文章

milvus对象存储和消息中间件的工厂设计模式分析

milvus对象存储和消息中间件的工厂设计模式分析 需求 根据参数设置创建mq和storage mq有kafka,pulsar storage有local,minio,remote 配置文件 根据配置文件选择初始化mq和存储: mq:type: pulsarcommon:storageType: minio对于这种类型一个是mq,一个是存储&…

抓住四月小尾巴,拿个offer~

首先声明一下~本人是个双非二本大三在校生。 从三月份就开始了苦哈哈的找实习之旅,快三月中旬才敢投大厂,为什么嘞?因为学校要求必须参加完期末考试才能出去实习(差不多七月初),因为这个好多公司一听就不安…

算法模版自用(杂)

文章目录 算法库函数next_permutation(start,end) prev_permutation(start,end) (全排列函数)nth_element (求第k小值)next(it,num),prev(it,num)min_element(begin(),end()),max_element(begiin(),end()) (取最小值最大值) _int128的输入输出STLlist 数…

serdes 同轴电缆和双绞线接法

1、同轴电缆 Coaxial Cable 2、双绞线STP(Shielded Twisted Pair) 比如我们用的车载camera一般就只需要接一路即可,RIN接camera, RIN-通过电容接地。

Android 使用 GeckoView 并实现 js 交互、权限交互

参考文档: geckoview版本 引入文档(有坑 下面会给出正确引入方式) 官方示例代码1 官方示例代码2 参考了两位大神的博客和demo: GeckoView js交互实现 geckoview-jsdemo 引入方式: maven {url "https://maven.…

MySQL中的死锁预防和解决

MySQL中的死锁预防和解决 死锁是数据库管理系统中常见的问题,特别是在高并发的应用场景下。MySQL数据库中的死锁会导致事务处理速度减慢,甚至完全停止,因此理解并预防死锁至关重要。本文将详细介绍如何预防MySQL中的死锁,包括常用…

【算法基础实验】图论-深度优先搜索和深度优先路径

深度优先(DFS) 理论基础 深度优先搜索(DFS, Depth-First Search)是图和树的遍历算法中的一种,它从一个节点开始,沿着树的边走到尽可能深的分支,直到节点没有子节点为止,然后回溯继续搜索下一个分支。DFS …

网络安全实训Day17and18

写在前面 第17和18天都讲的sql注入,故合并 ​​​​​​ 网络空间安全实训-渗透测试 Web渗透 定义 针对Web站点的渗透攻击,以获取网站控制权限为目的 Web渗透的特点 Web技术学习门槛低,更容易实现 Web的普及性决定了Web渗透更容易找到目…

JavaEE 初阶篇-深入了解 I/O 高级流(缓冲流、交换流、数据流和序列化流)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 缓冲流概述 1.1 缓冲流的工作原理 1.2 使用缓冲流的步骤 1.3 字节缓冲流于字符缓冲流的区别 1.4 字节缓冲流的实例 1.5 字符缓冲流的实例 2.0 转换流概述 2.1 字符…

MySQL函数之单行函数

1.前言 我们在使用 SQL 语言的时候,不是直接和这门语言打交道,而是通过它使用不同的数据库软件,即DBMS。DBMS 之间的差异性很大,远大于同一个语言不同版本之间的差异。实际上,只有很少的函数是被 DBMS 同时支持的。比…

MySQL基础知识——MySQL索引

深入浅出索引 索引的意义 索引的意义:在大量数据中,加速访问少量特定数据; 使用索引的前提条件: 1)索引块数量小于数据块数量; 2)索引键有序,故可以使用二分查找等高效的查找方式&…

go语言并发实战——日志收集系统(十) 重构tailfile模块实现同时监控多个日志文件

前言 在上一篇文章中,我们实现了通过etcd来同时指定多个不同的有关分区与日志文件的路径,但是锁着一次读取配置的增多,不可避免的出现了一个问题:我们如何来监控多个日志文件,这样原来的tailFile模块相对于当下场景就…

前端到全栈进阶之“前端框架”

从前端入门到全栈-系列介绍 你会学到什么? 可能学不到什么东西,该系列是作者本人工作和学习积累,用于复习 系列介绍 现在的 Web 前端已经离不开 Node.js,我们广泛使用的 Babel、Webpack、工程化都是基于 Node 的,各…

【Linux】驱动_2_字符驱动

1. Linux设备分类 字符设备: 指应用程序按字节/字符来读写数据的设备。通常为传真、虚拟终端和串口调制解调器、键盘之类设备提供流通信服务,通常不支持随机存取数据。字符设备在实现时大多不使用缓存器。系统直接从设备读/写每一个字符。块设备: 通常支持随机存取…

【程序分享1】LAMMPS + OVITO + 晶体缺陷识别 + 点缺陷 + 分子动力学模拟

分享2个分子动力学模拟相关的程序。 1. 一种识别体心立方晶体缺陷的新方法。 2. 无后处理的分子动力学模拟中的并行点缺陷识别: lammps的计算和转储方式 。 感谢论文的原作者! 第1个程序 关键词: 1. Atomistic simulations, 2. Molecular dynamics…

让客服工作开挂的8个客服办公高效率神器

做客服工作,经常需要写文案,做图片做视频,还要能快捷回复客户,都需要有靠谱的客服办公软件支持,本文介绍了8个高效神器,希望能帮到做客服的亲 前言 做客服工作,在回答客户咨询的同时&#xff0…

2024.4.28 机器学习周报

目录 引言 Abstract 文献阅读 1、题目 2、引言 3、创新点 4、总体流程 5、网络结构 5.1、损失函数 5.2、Confidence Maps 5.3、Part Affinity Fields(PAFs) 5.4、多人的PAFs 6、实验 7、结论 深度学习 yolov8实现目标检测和人体姿态估计 Yolov8网络结构 yaml…

【亲测可用】配置镜像源

文章目录 配置镜像源1. 手动添加镜像源2. 永久配置(推荐)方法1:方法2 : 小结 配置镜像源 配置镜像源会让资源下载的更快一些 我实验了一下,都成功了的方法,推荐给你们 1.手动添加 2.永久配置 前提是你的…

好看到爆炸的弹窗公告源码

源码介绍 好看到爆炸的弹窗公告源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面, 源码截图 源码下载 好看到爆炸的弹窗公告源码

新标准日本语初下 课后练习作业

新版标准日本语初下 第二十五課 これは明日会議で使う資料です 第二十五課 これは明日会議で使う資料です 24-04-26 練習25-1-1 例…