JVM—内存管理(运行时数据区)

news2025/2/26 18:43:58

背景介绍

当JVM类加载器加载完字节码文件之后,会交给执行引擎执行,在执行的过程中会有一块JVM内存区域来存放程序运行过程中的数据,也就是我们图中放的运行时数据区,那这一块运行时数据区究竟帮我们做了哪些工作?我们常说的线上内存泄漏和内存溢出是因为什么?我们今儿来揭开看看它神秘的面纱。
摘自网上


过程

在这里插入图片描述

  • 线程共有:堆、方法区
  • 线程私有:程序计数器、Java虚拟机栈、本地方法栈

一、 程序计数器(PC)

上官方百度百科介绍:
在这里插入图片描述
作用:存放当前线程执行的下一条指令地址。
在多线程环境下线程之间会涉及到线程切换问题,为了保证线程切换之后还能续按照上一次切换的位置继续执行,PC会进行指令的记录。PC是线程独有的,不可共享



二、Java虚拟机栈

作用:

每个线程在创建时都会创建一个虚拟机栈,保存了一个一个的栈帧 。针对栈帧我们来具体说说,下图为Java虚拟机中栈帧的内部结构,每执行一个方法都会创建一个栈帧(一个方法对应一个栈帧) ,而栈帧中包含了四部分:局部变量表、操作数栈、方法返回地址、动态链接,而每一个栈帧执行的过程也是入栈、出栈的过程。
在这里插入图片描述

包括:

  • 操作数栈(Operand Stack):用来在执行字节码指令过程中用来计算的
  • 局部变量表(LocalVariables):在方法执行过程中实时记录每个局部变量对应的值
  • 方法返回地址(Return Address):地址
  • 动态链接(Dynamic Linking):符号引用转换为调用方法的直接引用

特点:

  • 线程私有
  • 遵守栈FIFO规则,方法开始执行栈帧入栈,方法执行完栈帧弹出,所以虚拟机不需要垃圾回收

存在的问题:

  • 如果线程太多了,但是没有足够空间创建虚拟机栈,会发生栈溢出
  • 方法调用层次太多,可能出现StackOverflowError


三、本地方法栈(Native Method Stacks)

作用:存储Native方法


四、方法区(Method Area)

作用:
存储被Java虚拟机加载过后的class类信息、常量、静态变量、编译后的代码
不知道大家是否还记得上一篇分享中讲到的类加载过程,其中加载这一步会通过类全限定名加载成class类对象,其中就会把class信息、静态变量、常量等信息加载到方法区,看下面这张图
在这里插入图片描述


五、堆(Heap)

在这里插入图片描述

所有线程共享的一块内存区域,在new对象的时候会在Heap分配内存空间。可以细分为:

  • 年轻代和老年代,对应的比例为2:1 ,新生代存放朝生夕死的对象,老年代存放生命周期较长的对象
  • 年轻代又可以分为Eden、From Survivor、ToSurvivor三个区,对应的比例为:8:1:1(默认情况下,可以通过-XX:SurvivorRatio来调整)

那三个区域中对象是如何进行流转的呢?我们具体来看一下

1、在最开始讲述对象创建流程中包含了一步是分配内存,就是通过指针碰撞或空间散列在Heap中分配内存,新new对象的对象JVM会默认优先分配在Eden区,当Eden区空间逐渐减少(可以默认配置Eden空间容量)的时候,就会触发Young GC来清理,Eden区对象就会放入Survivor区;
2、Survivor区每次分配内存只使用其中一块,Eden和Survivor存活对象会复制到另一块Survivor区中,Eden和原来的Survivor区对象会被清理掉。(这也是为什么图中我只在其中一个Survivor区画了对象,另一块Survivor区没画的原因
3、在对象头中记录了对象迭代的年龄(年龄计数器),当进入Survivor区开始每YoungGC一次年龄就会+1,当年龄达到15的时候就会进入老年代

从图上我们看到进入老年代的条件远不止年龄>=15这一个,对象会进入老年代的方式共有四个:

  1. 长期存活:对象头中记录了对象迭代的年龄,每次迭代都会—+1,当年龄达到15(默认)
  2. 超大对象:占用大量连续空间
  3. 动态年龄判断:servivor中相同年龄对象的总和>survivor空间一半
  4. 空间分配担保:Young GC后,新生代有大量对象对象存活,需要老年代分配担保

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

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

相关文章

rancher + k3s + docker私有仓库搭建K8环境(百分之百成功)

1.环境准备(4台机器) 文档准备了4台虚拟机,系统是ubuntu server: ubuntu-22.04.1-live-server-amd64.iso 然后进行安装4台虚拟机,如图: 其中一台用于rancher、其余三台跑K8,一台master,两台工作…

写测试用例、重构函数、生成SQL查询……原来CodeGeeX还能做这些!

CodeGeeX中的智能问答功能“Ask CodeGeeX”可以帮助程序员解答开发过程中遇到的问题。但是“Ask CodeGeeX”的能力不止于此,用它还能帮助程序员高效编写测试用例,添加代码调试信息,实现SQL语句等等。 如果你还不知道如何实现,下面…

途乐证券-新股行情持续火爆,哪些因素影响首日表现?

全面注册制以来,参加打新的投资者数量全体呈现下降。打新收益下降,破发频出的布景下,投资者打新策略从逢新必打逐步向优选个股改变。 经过很多历史数据,从商场定价、参加者热度以及机构重视度维度揭秘了上市后股价体现优秀的个股具…

启动springboot,出现Unable to start embedded Tomcat

报错信息 org.apache.catalina.core.ContainerBase : A child container failed during startjava.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbedd…

AMEYA:ROHM新增5款100V耐压双MOSFET,实现业界超低导通电阻

全球知名半导体制造商ROHM(总部位于日本京都市)面向通信基站和工业设备等的风扇电机驱动应 用,开发出将两枚100V耐压MOSFET* 1一体化封装的双MOSFET新产品。新产品分“HP8KEx/HT8KEx (NchNch)系列”和“HP8MEx(NchPch*2)系列”两个系列,共5款新机型。 近…

知了汇智携手20余所高校开展实习实训,助力数字化人才培养

随着数字化转型推进的深入,企业对数字化人才的需求量大幅增长,人才需求结构也发生显著变化。知了汇智作为一家以就业为导向的产教融合服务机构,始终活跃于“育人”与“用人”的生态圈,通过与高校进行产业学院建设、共建实验室、共…

东南亚海外跨境物流管理,移动支付、数据处理程序开发

境外虚拟物流跨境支付平台快速搭建、集成后台采集功能的步骤如下: 一、项目规划与需求分析 在开始搭建境外虚拟物流跨境支付平台之前,需要进行详细的规划和分析。这包括确定项目的目标、了解客户需求、分析市场环境、确定系统架构和技术选型等。通过深…

一文带你快速了解和入门 Apinto 网关!

Apinto 网关快速入门 是 Eolink 旗下一款专门为微服务架构设计的开源 API 网关,完全由 Go 语言开发, 本文主要带大家认识 Apinto 网关以及如何实现快速入门操作。 首先,让我们一起了解 API 网关的概念。它类似于一个门户,用于管理…

finfet grid

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 90nm 及以下的工艺都要求储存器,IP,IO 的多晶硅方向必须和标准单元的多晶 硅方向保持一致,无法像过去工艺一样随意旋转方向。在 22nm 及以下…

shopee虾皮电商十个选品渠道!Get到了!

今天给大家分享虾皮的十个选品渠道,让选品不是难题!话不多都说,往下看! 1.搜索栏去搜索 拿台湾站来说,在shopee后台,我们搜索商品衬衫,在商品展示页面点击热销,除去第一排的广告商品…

元年方舟企业数字化PaaS平台入选《全国企业数字化转型十佳案例》|元年科技

7月4日,2023全球数字经济大会第二届全国企业数字化转型高峰论坛在京隆重举行。大会由全球数字经济大会组委会主办,中关村数字经济产业联盟承办,北京市科学技术协会鼎力支持。论坛期间元年科技凭借卓越案例《构建数字化转型引擎:元…

我的第一个创作纪念日

机缘 时间总是匆匆流逝,转眼间,我已经在前端领域迈入了第一个创作纪念日。回首往事,每一个创作的瞬间都如同一幅幅精彩的画面,在我心中留下深刻的印记。 日常 五年前,我踏入了前端职业的大门,初涉这片陌…

赛码网-01串的魔法(dp) 100%AC代码(C)

———————————————————————————————————— ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩最近在准备秋招,一直在练习编程。 ⏩本篇文章对赛码网的01串的魔法 题目做…

开放式耳机对耳朵伤害大吗?开放式耳机哪个好?

一般来说,开放式耳机对耳朵的伤害是较小的,因为开放式耳机不会像入耳式耳机那样深入耳道,而是贴近外耳,所以它对耳朵的压力和负担更小。开放式耳机采用不入耳设计,让你在享受音乐的同时,保持对外界的感知&a…

弹簧滑块模型微分方程PLC数值求解(Euler和Runge-Kutta法SCL源代码)

龙格库塔法求解微分方程的PLC算法,还可以参看下面这篇文章博客: 微分方程数值解法(Runge-Kutta法PLC实现)_RXXW_Dor的博客-CSDN博客微分方程数值解法之欧拉法请参看下面的博客文章:微分方程数值解法(PID仿真用一阶被控对象库PLC算法实现)_数学微积分算法plc编程实例_RXXW_D…

EMC框架简单归纳

电磁干扰的产生原因&#xff1a;电压/电流的变化中不必要的部分。 电磁干扰的耦合途径有两种&#xff1a;导线传导和空间辐射。 导线传导干扰原因是电流总是走“最小阻抗”路径。以屏蔽线为例&#xff0c;低频&#xff08;f<1kHz&#xff09;时&#xff0c;导线的电阻起到主…

Redisson可重入锁原理

微信公众号访问地址&#xff1a;Redisson可重入锁原理 推荐文章&#xff1a; 1、使用原生Redis命令实现分布式锁 ​ 2、为什么引入Redisson分布式锁&#xff1f; 3、SpringBoot整合多数据源&#xff0c;并支持动态新增与切换&#xff08;详细教程&#xff09; 4、SpringBo…

RDMA在典型场景下的技术应用分析与探索

本文首发于&#xff1a;RDMA在典型场景下的技术应用分析与探索 1.业务适配RDMA类型 RDMA传输的适配&#xff0c;从业务场景的使用角度来看&#xff0c;大致可分为如下几种类型。 场景一&#xff1a;机器学习、分布式存储等场景&#xff0c;使用社区成熟的方案&#xff0c;如在…

Linux之命名管道简单模拟进程间通信

Linux之命名管道简单模拟进程间通信 ​ ​ 文章目录 Linux之命名管道简单模拟进程间通信1.引言2.具体实现2.1服务端(Server.cc)2.2客户端(Client.cc) 3.结果 1.引言 ​ 首先&#xff0c;管道是一种半双工的单向进程间通信方式&#xff0c;也就是说它只能进行一边读一边写的…

【236. 二叉树的最近公共祖先】

目录 1.题目描述2.算法思路2.1算法思路12.2算法思路2 3.代码实现3.1代码实现13.2 代码实现2 1.题目描述 2.算法思路 2.1算法思路1 2.2算法思路2 思想很简单&#xff0c;但是最难的是怎么用栈来记录q、p的路线。所以下面才是关键。 3.代码实现 3.1代码实现1 class Solution…