【JVM】JVM 内存结构

程序计数器

Cpu 要不停的切换执行线程,所以在切换回同一个线程的时候要知道程序执行到哪了,程序计数器(PC 计数器),用来存储指向下一条指令的地址,也就是将要执行的代码。
程序的分支、循环、跳转、异常处理、线程恢复都需要程序计数器。
程序计数器是唯一一个在 JVM 规范中没有规定任何 OutOfMemoryError 情况的区域

虚拟机栈

概述

每个线程在创建的时候都会创建一个虚拟机栈,虚拟机栈里存储的是一个个栈帧,对应着一次次的 Java 方法调用,是线程私有的,生命周期与线程一致。
虚拟机栈对栈帧的操作只有压栈和出栈两个操作,在一个活动线程中,只有正在执行的方法的栈帧是有效的,这个栈帧被称作当前栈帧,与当前栈帧对应的方法叫做当前方法,当前方法所对应的类叫做当前类。

栈帧的结构

栈帧主要由四部分组成:

  • 局部变量表:存储方法的参数和定义在方法中的局部变量
  • 操作数栈:在字节码执行的过程中,向操作数栈中写入和写出数据,主要用于保存计算的中间结果,同时作为程序执行过程中,变量的临时存储
  • 动态链接:每一个栈帧中都包含一个指向运行时常量池中这个栈帧所属方法的引用
    在 Java 源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在 Class 文件的常量池中。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用
  • 方法返回地址

本地方法栈

本地方法栈类似于虚拟机栈,栈帧对应的方法为本地方法,native 修饰的方法,一般为 C语言编写的

内存划分

Java 堆是 Java 管理的最大一块内存,被所有线程共享。堆内存的唯一目的就是存放对象实例,几乎所有的对象实例的内存都是在这里被分配的。
Java 堆被分成两个代,新生代和老年代,新生代又被分为 eden 区和 survivor 区(from 和 to),分代的唯一目的就是使垃圾回收更有效。

  • 新生代:新对象和没有到达一定年龄的对象都在年轻代
  • 老年代:被长时间使用的对象,老年代的空间要比新生代大很多

年轻代

年轻代是几乎所有新对象创建的地方,年轻代被分为两个区域,eden 区和 survivor 区,suvivor 区又被分成两个部分,from 和 to,比例是 8:1:1,当年轻代内存满了之后会发生 GC,这种 GC 被称为 Minor GC

  • 几乎所有新创建的对象都会在 eden 区被分配内存
  • 当 eden 区满了会发生第一次 GC,扫描 eden 区将存活的对象都移动至 survivor from 区,清除掉垃圾对象
  • 当 eden 区再次触发 GC 的时候,会扫描 eden 区和 survivor from 区,对这两个区域进行垃圾回收,将存活的对象移动至 survivor to 区,同时将年龄 +1
  • 清空 eden 区和 survivor from 区后,将 from 区和 to 区交换,也就是说谁空谁是 to 区

老年代

老年代存储的对象包括经过许多轮 Minor GC(年龄15) 后仍然存活的对象和大对象

快速分配策略和逃逸分析

TLAB

对 Eden 区进行划分,为每个线程划分一个线程私有的缓存,多线程同时分配的时候,使用 TLAB 可以进行快速分配避免一些多线程的安全问题,这就是快速分配策略

逃逸分析

器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。
逃逸分析的基本行为就是分析对象动态作用域:

  • 当一个对象在方法中被定义后,对象只在方法内部使用,则认为没有发生逃逸。
  • 当一个对象在方法中被定义后,它被外部方法所引用,则认为发生逃逸。例如作为调用参数传递到其他地方中,称为方法逃逸。

方法区

永久代和元空间

  1. 方法区是 JVM 规范中的定义的一个概念,具体实现各个jvm厂商可能不同,以 HotSpot 为例,在 Java7 中使用永久代来实现方法区,永久代在物理上是与堆空间连续的受JVM垃圾回收的管理;在Java8中,使用了元空间来代替永久代实现方法区,元空间使用的是本地内存也就是堆外内存,不受JVM管理,因此很少出现方法区的内存溢出。
  2. 永久代和元空间存储的内容是不同的,元空间存储的是类的元信息,静态变量和常量池都并入堆中;相当于永久代的内容被划分到了堆(静态变量和常量池)和堆外内存(类的元信息)
    方法区的内部结构
    方法区用于存储已经被虚拟机加载的类型信息、常量、静态变量以及即时编译器编译后的代码缓存。

运行时常量池

  1. 常量池表:
    我们知道常量池是 class 字节码文件的一部分,主要存储的是字面量和符号引用(类和接口的全限定名;变量的名称和描述符;方法的名称和描述符)
    一个 Java 的类、接口编译后会产生一个字节码文件,这个字节码文件通常需要数据的支持,但是这个数据可能会很大,不能存在字节码中,所以就换一个方式存储在常量池表中,然后字节码有指向这个常量池的符号引用。下图中的#2即为符号引用,引用了常量池
    常量池可以看作是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等类型。
    在这里插入图片描述
  2. 运行时常量池:
  • 在类加载到虚拟机之后会创建对应的运行时常量池
  • 常量池表是 Class 字节码文件中的一部分,用于存储编译时期生成的各种字面量和符号引用,这一部分在类加载后会被存储到方法区的运行时常量池中
  • 运行时常量池中包含了各种不同的的常量,既包括在编译期间就已经明确的数值字面量,也包括到运行期解析后才能够获得的方法或字段引用。此时不再是常量池中的符号地址了,这里换为真实地址
  • 运行时常量池,相对于 Class 文件常量池的另一个重要特征是:动态性,Java 语言并不要求常量一定只有编译期间才能产生,运行期间也可以将新的常量放入池中,String 类的 intern() 方法就是这样的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文解读】大模型的有效探索

一、简要介绍 论文提出的证据表明,通过有效地探索收集人类反馈以改进大型语言模型有实质性的好处。在论文的实验中,一个代理依次生成查询,同时拟合一个奖励模型的反馈收到。论文的最佳性能代理使用双汤普森抽样生成查询,其不确定性…

“香港世界”模型问世!颠覆传统SLAM技术,引领复杂定位新纪元!

论文标题: Hong Kong World: Leveraging Structural Regularity for Line-Based SLAM 论文作者: Haoang Li, Ji Zhao, Jean-Charles Bazin, Pyojin Kim, Kyungdon Joo, Zhenjun Zhao, Yun-Hui Liu 导读: 在视觉感知技术中,理解…

力扣 单链表元素删除解析及高频面试题

目录 删除元素的万能方法 构造虚拟头结点来应对删除链表头结点的情况 一、203.移除链表元素 题目 题解 二、19.删除链表中倒数第K个节点 题目 题解 三、 83.删除某个升序链表中的重复元素,使重复的元素都只出现一次 题目 题解 82.删除某个升序链表中的…

玛格家居从深交所转板北交所:营收净利润连年下滑,销售费用大增

《港湾商业观察》施子夫 近日,玛格家居股份有限公司(以下简称,玛格家居)发布公告,重庆证监局已经受理其北交所上市的备案申请,辅导机构为国泰君安证券。 公开信息显示,2022年1月,玛…

DreamView数据流

DreamView数据流 查看DV中界面启动dag,/apollo/modules/dreamview_plus/conf/hmi_modes/pnc.pb.txt可以看到点击界面的planning按钮,后台其实启动的是/apollo/modules/planning/planning_component/dag/planning.dag和/apollo/modules/external_command…

使用网络抓取器进行网络抓取--你需要了解的一切

什么是网页抓取? 网页抓取是一种计算机化过程,用于从网站上收集大量数据。它也常被称为网页数据提取或网页数据抓取。 网页抓取需要两个部分 - 爬虫和抓取器。 爬虫是一种AI算法,通过跟随互联网中的链接来搜索所需的特定数据。抓取器是一种…

Python对象不可哈希?教你几招解决!

目录 1、什么是可哈希?🚀 1.1 哈希基础理论 1.2 可哈希对象定义🔍 示例代码: 1.3 Python中哈希的作用 1.4 哈希表与性能提升📈 应用实例代码: 2、Python中的哈希特性🔑 2.1 不变性与哈希值🔄 示例代码展示: 2.2 实现细节深入探讨📚 深入代码细节:…

小区服务前台小程序的设计

管理员账户功能包括:系统首页,个人中心,住户管理,管理员管理,员工管理,安保管理,安保分配管理,客服聊天管理 微信端账号功能包括:系统首页,公告,…

【传知代码】揭秘AI如何揪出图片中的“李鬼”(论文复现)

在数字化时代,我们时常被各种图像信息所包围。然而,这些图像中有时隐藏着不为人知的秘密——被篡改的文字或图像。这些被篡改的内容可能误导我们的判断,甚至在某些情况下造成严重的后果。幸运的是,随着人工智能(AI&…

免费开源AI生产力工具:内置专属ChatGPT、一键智能处理图片和视频(擦除水印、卡通漫画、无损放大、插值补帧、智能修复、3D转制、上色修复、合成整理)

AI 生产力工具 免费开源,提升用户生产力,保障隐私和数据安全。提供高效便捷的AI解决方案,包括但不限于:内置专属ChatGPT、一键批量智能处理图片和视频等。 主要特点 免费开源:免费使用,源代码开放&#…

使用Nginx反向代理KKFileView遇到问题

使用KKFileView 4.0 以上版本 在KKFileView官网上,关于使用Nginx代理,建议配置如下 一、修改Nacos 在Nginx的conf文件夹中修改 nginx.conf ,新加 红框内的IP地址为代理服务器地址(即安装KKFileView的服务器地址) 二、修改KKFil…

逻辑这回事(七)---- 器件基础

Xilinx FPGA创建了先进的硅模块(ASMBL)架构,以实现FPGA具有针对不同应用程序领域优化的各种功能组合的平台。通过这一创新,Xilinx提供了更多的设备选择,使客户能够为其特定设计选择具有正确的功能和功能组合的FPGA。ASMBL体系结构通过以下方式突破了传统的设计障碍:消除几…

一个时代的结束:Centos7将在6月30日退出历史舞台

友情提醒: 如果你使用的是曾经辉煌一时的CentOS Linux 7,一直拖延没有迁移,那么现在距离它正式寿终正寝还有不到一周的时间。 CentOS Linux 7 的结束日期仍定在2024年6月30日。红帽早在 2020 年就做出了有争议的举动,将重点转移到…

前后端交互整合 - Wiki

集成 Http 库 axios 首先在前端工程中安装 axios ,切换为 wiki / web 目录下,安装命令行为 npm install axios --save 通过 axios 调用电子书列表接口: 定义 setup( ) 方法,页面被调用时便会执行此方法,在方法中要想使用 axios ,首先需要引入 axios 包: import axios f…

网络安全 文件上传漏洞-18 第十八关 Pass-18

点击进入第十八关,并选择显示代码: //index.php $is_upload false; $msg null; if (isset($_POST[submit])) {require_once("./myupload.php");$imgFileName time();$u new MyUpload($_FILES[upload_file][name], $_FILES[upload_file][tmp…

百日筑基第七天-JAVA开发IDEA调试技巧(常用按钮)

百日筑基第七天-JAVA开发IDEA调试技巧(常用按钮) 1.Show Execution Point 快捷键:Alt F10 回到当前激活的断点处;当你的鼠标不在断点所处的行,点击之后,会立马复位到断点处; 2.Step Ove 快…

你需要精益管理咨询公司的N+1个理由

近年来,精益管理作为一种被全球众多知名企业验证过的成功管理模式,越来越受到企业的青睐。但是,为何在实施精益管理的过程中,众多企业纷纷选择请咨询公司来协助呢?今天,我们就来一起揭秘这背后的原因。 1. …

go Channel原理 (三)

Channel 设计原理 不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存。 在主流编程语言中,多个线程传递数据的方式一般都是共享内存。 Go 可以使用共享内存加互斥锁进行通信,同时也提供了一种不同的并发模型,即通…

使用热力图表示联邦学习场景中的客户端数据分布

用于生成热力图,记录过程,方便之后直接使用。 使用场景:联邦学习中显示客户端数据分布,或者显示数据分布的各类其他场景 文章目录 一、代码hot.py使用方法 二、参数解释三、样图关键词 一、代码 写这段代码时主要考虑联邦学习中显…

阿里云物联网应用层开发:第一部分,项目简介

文章目录 1、物联网应用层简介2、阿里云物联网应用层开发例程主要内容3、需要掌握基础知识 1、物联网应用层简介 应用层是物联网系统的用户界面,它提供了用户与系统交互的接口,这一层是将网络传输层的数据结果以易于理解和使用的方式呈现给用户&#xf…