【JVM】Java的内存模型(JMM)!

news2024/10/5 22:25:51

一、运行时数据区域划分

JVM虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。

  • JDK 1.8分为:线程共享Heap堆区、Method Area方法区)、线程私有(虚拟机栈、本地方法栈、程序计数器)
  • JDK 1.8分为:线程共享Heap堆区MetaSpace 元空间)、线程私有虚拟机栈本地方法栈程序计数器

 

二、JVM中程序计数器(Program Counter Register)

是一块非常小的内存区域,它的作用是记录当前线程执行的字节码指令的地址。在Java虚拟机中,每个线程都有自己独立的程序计数器,因此多线程之间执行的程序计数器互不干扰。

程序计数器主要有如下两个作用

  • 线程切换恢复:当线程被切换时,程序计数器可以帮助线程恢复到之前执行的位置,从而继续执行。

  • 字节码指令定位:程序计数器可以帮助JVM在多线程环境下准确地定位到每个线程正在执行的指令,从而保证线程间的切换和协作的正确性。

  • 异常情况 

程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它随着线程的创建而创建,随着线程的结束而死亡。

三、Java 虚拟机栈(VM Stack) 

Java 虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有局部变量表操作数栈动态链接方法出口信息。 

 操作数栈:主要用于保存计算过程中的中间结果,同时作为计算过程中变量临时的存储空间。

当一个方法开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令向操作数栈中写入和提取内容,也就是出栈和入栈操作。

例如整数加法(2+3)的字节码指令iadd,这条指令在运行的时候要求操作数栈中最接近栈顶的两个元素已经存入了int类型的数据,当执行这个指令时,会把这两个int值出栈并相加,然后将相加的结果重新入栈。

每一次方法调用都会有一个对应的栈帧被压入 VM Stack虚拟机栈,每一个方法调用结束后,代表该方法的栈帧会从VM Stack虚拟机栈中弹出。

在活动线程中, 只有位于栈顶的帧才是有效的, 称为当前活动栈帧,代表正在执行的当前方法。
操在JVM执行引擎运行时, 所有指令都只能针对当前活动栈帧进行操作。虚拟机栈通过 poppush的方式,对每个方法对应的活动栈帧进行运算处理,方法正常执行结束,肯定会跳转到另一个栈帧上。

  • 异常情况

Java 虚拟机栈会出现两种错误:StackOverFlowError OutOfMemoryError

  • StackOverFlowError 当线程请求栈的深度超过 JVM虚拟机栈的最大深度的时候,就抛出 StackOverFlowError 错误。
  • OutOfMemoryError JVM的内存大小可以动态扩展, 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。

四、本地方法栈(Native Method Stack) 

native关键字修饰的本地方法被执行的时候,在本地方法栈中也会创建一个栈帧,用于存放该native本地方法的局部变量表、操作数栈、动态链接、方法出口信息。方法执行完毕后,相应的栈帧也会出栈并释放内存空间。

  • 异常情况

也会出现 StackOverFlowErrorOutOfMemoryError两种错误。 

五、堆(Heap) 

堆的作用是存放对象实例和数组

从结构上来分,可以分为新生代和老年代。而新生代又可以分为Eden 空间、From Survivor 空间(s0)、To Survivor 空间(s1)。 所有新生成的对象首先都是放在新生代的。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来的对象,和从前一个Survivor复制过来的对象,而复制到老年代的只有从第一个Survivor区过来的对象。而且,Survivor区总有一个是空的。

(1)新生代和老年代

 

(2)创建对象的内存分配

创建一个新对象,在堆中的分配内存。

大部分情况下,对象会在 Eden生成,当 Eden 区装填满的时候,会触发 Young Garbage Collection,即 YGC垃圾回收的时候,在 Eden 区实现清除策略,没有被引用的对象则直接回收。

依然存活的对象会被移送到 SurvivorSurvivor 区分为 s0 s1 两块内存区域。每次 YGC的时候,它们将存活的对象复制到未使用的Survivor 空间(s0s1),然后将当前正在使用的空间完全清除,交换两块空间的使用状态。每次交换时,对象的年龄会加+1

如果 YGC 要移送的对象大于 Survivor 区容量的上限,则直接移交给老年代。一个对象也不可能永远呆在新生代,在 JVM 中 一个对象从新生代晋升到老年代的阈值默认值是 15,可以在 Survivor区交换 14 次之后,晋升至老年代。

  • 异常情况

如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError 异常

堆区最容易出现的就是 OutOfMemoryError错误,这种错误的表现形式会有以下两种:

  1. OutOfMemoryError: GC Overhead Limit Exceeded JVM花太多时间执行垃圾回收,并且只能回收很少的堆空间时,就会发生此错误。
  2. OutOfMemoryError: Java heap space假如在创建新的对象时, 堆内存中的空间不足以存放新创建的对象, 就会引发此错误。

六、元空间(Meta Space)

 用于存放类信息常量静态变量JIT即时编译器编译后的机器代码等数据等。例如:java.lang.Object类的元信息、Integer.MAX_VALUE常量等。

七、字符串常量池 

(1)String的两种创建方式

  • 第一种方式是在常量池中获取字符串对象;
  • 第二种方式是直接在堆内存空间创建一个新的字符串对象;

(2)Stringintern()方法

  • 检查指定字符串在常量池中是否存在?如果存在,则返回地址,如果不存在,则在常量池中创建

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

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

相关文章

“一种三元前驱体废水螯合树脂回收钴的装置”实用新型专利

“一种三元前驱体废水螯合树脂回收钴的装置”实用新型专利 (证书号:第19681862号;专利号:ZL 2022 2 1042752.0) 三元前驱体通常由三元液(硫酸镍、钴、锰的混合溶液)、液碱与氨水在一定条件下液相合成,再经陈化、固液分离、流水洗涤、干燥、过…

PMP考试注意事项有哪些?

1. PMI明确规定:不允许考生使用自带文具,包括自带的笔、削笔刀、橡皮、笔袋、计算器和草稿纸等。 2. 本次考试考场内为每位考生配备2B铅笔、橡皮、计算器(若有需要)和草稿纸。如文具有缺损或考试过程中如需更换铅芯等,请向监考老师举手示意。…

【实战】H5 页面同时适配 PC 移动端 —— 旋转横屏

文章目录 一、场景二、方案三、书单推荐01 《深入实践Kotlin元编程》02 《Spring Boot学习指南》03 《Kotlin编程实战》 一、场景 一个做数据监控的单页面,页面主要内容是一个整体必须是宽屏才能正常展示,这时就不能用传统的适配方案了,需要…

DC电源模块单路、双路输出的不同应用场景

BOSHIDA DC电源模块单路、双路输出的不同应用场景 DC电源模块是一种常见的供电设备,通常用于将市电转换为稳定的直流电源,以供电给各种电子设备。DC电源模块的输出方式分为单路和双路两种,下面将分别介绍它们的不同应用场景。 一、单路输出…

wx.getPrivacySetting 小程序隐私保护指引的使用(复制粘贴即用)

创建privacyPopup 组件 privacyPopup.js Component({properties: {},data: {wxPrivacyName: ,showAgreement: false},lifetimes: {attached() {this.init();}},methods: {async init() {if (isLogin()) {const userPrivacy await this.getPrivacy();this.setData({wxPrivacy…

vue项目生产环境隐藏暴露的代码_源码

// 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 productionSourceMap: false,

思维导图,掌握思维的艺术!免费的Mindomo Desktop for Mac等你来体验

您是否曾为了整理复杂的思绪而苦恼?或许您需要一款强大而直观的思维导图软件来帮助您理清思路。Mindomo Desktop for Mac是一款免费的思维导图软件,它将为您带来高效的思考和组织工具。 Mindomo Desktop for Mac的界面简洁直观,操作简单易上…

留资机器人助你有效提高营销成功率

我们都知道,当客户产生留资行为,就要抓住机会,让工作人员及时地对客户进行回访,然后将留资线索跟踪、维系。而如何准确有效地提高客户保留率和转化率是营销成功的关键。所以对于企业来说,留资机器人正是引导客户留资&a…

自动化测试工程师简历(吐血整理)附模板

张三(软件测试) 联系电话:175XXXXXXXXX 电子邮件:XXXqq.com 学 历:本 科 专 业:计算机科学与技术 毕业院校:XXXXXX …

Redis缓存高可用集群

1、Redis集群方案比较 哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可…

Postman应用——接口请求(Get和Post请求)

文章目录 新增请求接口请求Get接口请求Post 这里只讲用的比较多的Get和Post请求方式,也可以遵循restful api接口规范,使用其他请求方式。 GET(SELECT):从服务器取出资源(一项或多项)POST&#…

建筑模板的成本如何控制?

建筑模板是在施工过程中用于支撑混凝土浇筑的临时结构,对于建筑项目而言,模板的成本控制是一个重要的方面。有效地控制模板成本可以帮助降低整体工程成本,并提高项目的经济效益。本文将从不同网站链接的内容中总结出一些关键要点,…

2023华为OD统一考试(B卷)题库清单(按算法分类),如果你时间紧迫,就按这个刷

目录 专栏导读华为OD机试算法题太多了,知识点繁杂,如何刷题更有效率呢? 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、优先队列4、滑动窗口5、二叉树6、并查集7、栈 三、算法1、基础算法① 贪心算法② 二分查找③ 分治…

HTML5+CSS3小实例:纯CSS实现彩虹倒映水面的唯美背景

实例:纯CSS实现彩虹倒映水面的唯美背景 技术栈:HTML+CSS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" …

JavaScript的事件监听

一、认识事件处理 1.认识事件 Web页面需要经常和用户之间进行交互&#xff0c;而交互的过程中我们可能想要捕捉这个交互的过程&#xff1a; 比如用户点击了某个按钮、用户在输入框里面输入了某个文本、用户鼠标经过了某个位置&#xff1b;浏览器需要搭建一条JavaScript代码和…

Spark on YARN 部署搭建详细图文教程

目录 一、引言 二、SparkOnYarn 本质 2.1 Spark On Yarn 的本质? 2.2 Spark On Yarn 需要啥? 三、配置 spark on yarn 环境 3.1 spark-env.sh 3.2 连接到 YARN 中 3.2.1 bin/pyspark 3.2.2 bin/spark-shell 3.2.3 bin/spark-submit (PI) 四、部署模式 DeployMod…

首发悬赏算命测算源码

可以用二维码收款 可以直接拿来运营吸金&#xff01; 用户可以通过发布悬赏赏金算命&#xff0c;也可以通过升级发布测算任务来吸金 安装教程&#xff1a; 测试环境&#xff1a;php5.6apache2.4mysq5.6 安装&#xff1a; 1.源码解压到根目录 修改 \Application\Common\Co…

学习Kotlin看哪些书?【赠书活动|第八期《深入实践Kotlin元编程》】

文章目录 图书简介01 《深入实践Kotlin元编程》02 《Spring Boot学习指南》03 《Kotlin编程实战》 抽奖方式 与Java一样&#xff0c;Kotlin也是用于Android应用程序开发的编程语言&#xff0c;是Android官方支持的第二种编程语言。 2016年Kotlin正式发布&#xff0c;在Android“…

【Flowable】任务监听器(五)

前言 之前有需要使用到Flowable&#xff0c;鉴于网上的资料不是很多也不是很全也是捣鼓了半天&#xff0c;因此争取能在这里简单分享一下经验&#xff0c;帮助有需要的朋友&#xff0c;也非常欢迎大家指出不足的地方。 一、监听器 在Flowable中&#xff0c;我们可以使用监听…

怎样下载和安装HBuilder软件?【附HBuilder快捷键】

HBuilder是一款深度集成Eelipse的IDE编辑器&#xff0c;但其主要集中在Web前端的开发&#xff0c;不能进行Java等后台开发。HBuilder提供了对JavaScrijpt、jQuery、HTML5、MUI等语法的提示功能&#xff0c;同时包含很多快捷键&#xff0c;让前端开发更加便捷。 访问HBuilder官…