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

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

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

相关文章

bugfix: com.alibaba.druid.sql.parser.EOFParserException: EOF

前言 在日常的开发工作中,我们经常会遇到各种各样的问题,其中涉及数据库操作的接口联调尤其容易出现意想不到的状况。今天我就遇到了一个关于Druid SQL解析异常的问题,具体表现为com.alibaba.druid.sql.parser.EOFParserException: EOF。通过…

基于SpringBoot开发的同城租房系统租房软件APP小程序源码

项目背景 一、市场前景 随着城市化进程的加快和人口流动性的增强,租房市场正逐渐成为一个不可忽视的巨大市场。传统的租房方式往往存在着信息不对称、效率低下等问题,而同城租房软件的出现,则有效地解决了这些问题,为租房市场注…

为什么近年来机器学习这么火!!

机器学习(Machine Learning)是一种人工智能(AI)的分支,它让计算机能够通过数据学习和改进,而无需明确的编程。这意味着机器学习系统可以从经验中学习,逐步提高其性能。它基于统计学和数学算法&a…

《欢乐钓鱼大师》攻略,钓友入坑必备!

欢迎来到《欢乐钓鱼大师》!在这个游戏里,你可以尽情享受垂钓的乐趣,通过不断更换和升级高阶鱼竿,轻松地钓到各种稀有鱼类。因为许多玩家在挑战关卡时遇到了一些困难,所以今天我给大家带来了《欢乐钓鱼大师攻略指南》&a…

【产品经理修炼之道】- 消金支付体系

我们常听说“互联网的尽头是放贷”,而当支付与金融结合会衍生出各种场景。本文将给大家拆解下不同消费金融场景下的支付案例,一起来看看吧。 各位小伙伴,大家好! 我们常听说“互联网的尽头是放贷”,确实这说其实话糙…

Springboot 中RedisTemplate使用scan来获取所有的key底层做了哪些事情

直接上代码&#xff0c;围绕着代码来讨论 redisTemplate.execute((RedisCallback<Object>) (connection) -> {Cursor<byte[]> scan connection.scan(ScanOptions.scanOptions().count(2).match("*").build());scan.forEachRemaining((bytes) -> {…

通信原理(2)--随机过程

通信原理(2)–随机过程 3.1随机过程的基本概念 随机过程{x(t)}由一族时间函数 x i ( t ) x_i(t) xi​(t)&#xff0c;i1,2.3…组成&#xff0c;每一个时间函数 x i ( t ) x_i(t) xi​(t)称为随机过程{x(t)}的一个样本函数&#xff08;一个实现&#xff09; 每个样本函数在时间…

Java设计模式 _结构型模式_适配器模式

一、适配器模式 **1、适配器模式&#xff08;Adapter Pattern&#xff09;**是一种结构型设计模式。适配器类用来作为两个不兼容的接口之间的桥梁&#xff0c;使得原本不兼容而不能一起工作的那些类可以一起工作。譬如&#xff1a;读卡器就是内存卡和笔记本之间的适配器。您将…

C语言笔试题之找出数组的最大公约数

找出数组的最大公约数 实例要求 1、给定一个整数数组 &#xff0c;返回数组中最大数和最小数的最大公约数&#xff1b;2、两个数的最大公约数是能够被两个数整除的最大正整数&#xff1b;示例&#xff1a; 实例分析 1、要找到数组中最大数和最小数的最大公约数&#xff1b…

【后端】python与django的开发环境搭建指南

安装Git 双击Git 客户端安装文件&#xff0c;在安装页面&#xff0c;单击“Next” 在安装路径选择页面&#xff0c;保持默认&#xff0c;单击“Next” 在功能组件选择页面&#xff0c;保持默认&#xff0c;单击“Next” 在开始菜单文件夹设置页面&#xff0c;保持默认&am…

阿斯达年代记游戏下载教程 阿斯达年代记下载教程

《阿斯达年代记&#xff1a;三强争霸》作为一款气势恢宏的MMORPG大作&#xff0c;是Netmarble与STUDIO DRAGON强强联合的巅峰创作&#xff0c;定于4月24日迎来全球玩家热切期待的公测。游戏剧情围绕阿斯达大陆的王权争夺战展开&#xff0c;三大派系——阿斯达联邦、亚高联盟及边…

无人机反制:高功率微波反无人机系统技术详解

随着无人机技术的快速发展&#xff0c;无人机在民用和军用领域的应用越来越广泛。然而&#xff0c;无人机滥用、非法入侵和恶意攻击等问题也日益凸显&#xff0c;对国家安全、公共安全和个人隐私造成了严重威胁。因此&#xff0c;研发高效、快速、安全的无人机防御系统成为当前…