运行时内存分配

news2025/4/25 17:15:02

目录

一、程序计数器

二、虚拟机栈

3、本地方法栈

4、Java堆(Heap)

5、方法区


很多人将 JAVA 内存分为堆内存(Heap)栈内存(Stack),这种划分方式在一定程度上体现这两块区域是 Java 工程师最关注的内存区域。但是这种划分方式并不完全正确,Java 的内存区域划分实际上远比这复杂,Java 虚拟机在执行 Java 程序的过程中,会把他管理的内存划分为不同的数据区域。如下图

一个 HelloWorld.java 程序被编译为 HelloWorld.class 文件后,由类加载器 ClassLoader 加载 JVM 的内存中。JVM 中的内存可以划分为若干个不同的数据区:程序计数器虚拟机栈本地方法栈方法区

一、程序计数器

Java程序是多线程的,CPU 可以在多个线程中分配执行实际片段。

作用:当某个线程被 CPU 挂起时,需要记录当前代码已经执行到的位置,方便 CPU 重新执行此线程时,知道重那行指令开始执行。

程序计数器是虚拟机中一块较小的内存空间,主要用于记录当前线程执行的位置。

程序计数器的几点注意

1. 在 Java 虚拟机规范中对程序计数器这一区域没有规定任何的 OutOfMemoryError 情况。

2. 程序计数器是线程私有的数据区,每个线程内部都有一个私有的程序计数器,它的生命周期随着线程的创建而创建,随着线程的结束而消亡。

3. 当一个线程正在执行一个 Java 方法时,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果正在执行的是 Native 方法,这个计数器值则为空。

二、虚拟机栈

虚拟机栈也是线程私有的,与线程的生命周期同步。在 Java 虚拟机规范中,对这个区域规定了两种异常情况:1)StackOverflowError: 当线程请求栈深度超出虚拟机栈所允许的深度时抛出;2) OutOfMemoryError: 当 Java 虚拟机动态扩容到无法申请足够内存时抛出。

JVM 是基于栈的解释器执行的,这里的“栈”指的就是虚拟机栈。DVM 是基于寄存器解释器执行的。虚拟机栈的初衷是用来描述 Java 方法执行的内存模型。每个方法被执行的时候,JVM 都会在虚拟机张中创建一个栈帧

栈帧

栈帧是用于支持虚拟机进行方法调用方法执行的数据结构,每个线程在执行某个方法时,都会为这个方法创建一个栈帧。一个线程包含多个栈帧(多个方法),而每个栈帧内容包含:局部变量表,操作数栈,动态连接和返回地址。

局部变量表:是变量值的存储空间。调用方法时传递的参数,在方法内存创建的局部变量都保存在局部变量表中。在 Java 编译成 class 文件的时候,会在方法的 Code 属性表中的 max_locals 数据项中确定该方法需要分配的最大局部变量表的容量。

该程序编译成 class 文件,使用 javap -v 反编译成字节码指令

里面的 "locals = 3",就代表局部变量表的长度为3,分别保存参数k, 局部变量i ,j。

操作数栈:常称为操作栈,它是一个后人先出栈(LIFO)。操作数栈的最大深度也在编译的时候写入方法的 Code 属性表中的 max_stacks 数据项中。栈中的元素可以是任意 Java 数据类型,包括 long 和 double。当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法执行的过程中,会有各种字节码指令被压入和弹出操作数栈。

动态链接:主要目的是为了支持方法调用过程中的动态连接(Dynamic Linking)。在一个 class 文件中,一个方法要调用其他方法,需要将这些方法的符号引用转化为其所在内存地址中的直接引用,而符号引用存放在 方法区中。Java 虚拟机栈中,每个栈帧都包含一个指向运行时常量池中该栈所属方法的符号引用(每个栈帧包含一个符号引用-->该栈所属的方法)。

返回地址:当一个方法开始执行后,只有两种方式可以退出这个方法:1)正常退出:指方法中的代码正常完成,或者遇到任意一个方法返回的字节码指令(如return)并退出没有抛出任何异常;2)指方法执行过程中遇到异常,并且这个异常在方法体内部没有得到处理,导致方法退出。

虚拟机栈中的返回地址是用来帮助当前方法恢复它的上层方法执行状态。正常退出时,调用者的 PC 计数值可以作为放回地址,栈帧中可能保存此计数值;异常退出时,放回地址是通过异常处理器表确定的,栈帧中一般不会保存此信息。

3、本地方法栈

 本地方法栈和虚拟机栈级别相同,是针对本地(native)方法。在开发中如果涉及 JNI 可能接触本地方法栈多一些,在有些虚拟机的实现中已经将两个合二为一(比如 HotSpot)。

4、Java堆(Heap)

是 JVM 所管理的内存中最大的一块,该区域唯一的目的就出存放对象实例

是 Java 垃圾收集器(GC)管理的主要区域,有时候也叫做 “GC堆”。

是所有线程共享的内存区域。被分配在此区域的对象如果被多个线程访问,需要考虑线程安全问题。 

 按照对象存储时间的不同,堆中的内存可以划分为新生代老年代,其中新生代右被划分为 EdenSurvivor 区。不同的区域存放具有不同生命周期的对象,这样可以根据不同的区域使用不同的垃圾回收算法。

5、方法区

方法区是 JVM 规范里规定的一块运行时数据区。主要存储:已经被 JVM 加载的类信息(版本,字段,方法,接口);常量;静态变量;即时编译器编译后的代码;数据。该区域是被各个线程共享的内存区域。 

方法区与永久区:

方法区是规范层面的东西,规定了这一区域要存放哪些数据;永久区或者是 metaspace 是对方法区的不同实现,是实现层面的东西。

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

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

相关文章

AttributeError: ‘Prophet‘ object has no attribute ‘stan_backend‘解决方案

在使用Facebook prophet过程遇到如下问题: 代码如下: from prophet import Prophet model Prophet()执行程序报如下错误: File "D:\Python\Python38\lib\site-packages\prophet\forecaster.py", line 156, in _load_stan_backend…

如何构建基于大模型的App

ChatGPT 的出现让大模型再一次成为业界的关注热点,然而,并不是每个组织都要去训练及生成大模型的,而且各个组织的技术积累和计算资源也不太允许这样去做。更多的时候, 我们还是基于大模型开发业务应用。所谓智能原生(A…

Spring MVC 入门指南

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Windows系统利用cpolar内网穿透搭建Zblog博客网站并实现公网访问内网!

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员,自己搭建网站制作网页是绕…

使用github创建个人页面,以及git的两种使用方式

目录 前言记录如何使用vs code提交代码 一、个人页面的创建二、Git的使用1.Git的工作原理2. 如何使用VS Code同步代码到远程仓库参考3. 如何在github网页上提交更新 前言 本篇主要介绍两个干货:1、如何利用github创建个人页面,对于学者范儿的从业人员可…

【已解决】windows10误删环境变量Path

【已解决】windows10误删环境变量Path 1.问题描述 进行python环境配置时,误删Path全部环境变量 2.解决原理及操作 图形化界面修改Path:同步到注册表,立即生效,已打开的cmd不会生效cmd命令修改Path:同步到注册表&am…

报错处理:Java休眠时在CPU上运行

大家好,今天我来分享一个我在运维过程中遇到的问题,关于Linux上Tomcat启动时出现的“Java休眠时在CPU上运行”的报错,以及如何解决这个问题的。 首先,让我们来看看这个报错信息。当你在启动Tomcat时,如果你看到类似的错…

SpringMVC 学习(四)RestFul 风格

5. RestFul 风格 5.1 简介 概念 Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。 功能 资源:互联网所有的事物都可以被抽象为…

【冰糖R语言】创建R包(打包R程序)

目标:将现有R程序打包 可能涉及知识点:devtools包、usethis包、Rstudio软件 一、R包的类型 通常一个R包中包含以下元素: 1)R文件夹:函数代码 2)man文件夹:存放每个函数的注释文件 3&#x…

千万别把工作 当成天大的事

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 工作不是我们的“主业”,人生才是。K哥一位前同事的遭遇,让我对这句话有了更深的感受。这位前同事,是某大厂高管,由于长期作息不规律和巨大工作压力&…

C++:线上课程2_12(多态和虚函数)

文章目录 一、多态1.多态定义2.多态分类2.1编译时的多态2.2运行时的多态 二、虚函数1.定义2.成员函数与虚函数3.为什么构造函数(移动构造函数,拷贝构造函数)不可以定义为虚函数?4.示例5.对象和指针和引用调用6.虚表分配7.this指针…

【Redis7】--6.集群

文章目录 集群1.基本介绍2.redis集群槽位3.redis集群分片4.redis槽位映射5.redis集群环境搭建5.1三主三从redis集群配置5.2启动六台redis实例5.3构建主从关系 6.redis集群读写7.redis集群主从切换8.redis集群扩容9.redis集群缩容10.集群常用操作命令和CRC16算法分析 集群 1.基…

聊聊复杂网络环境下hdfs的BlockMissingException异常|参数dfs.client.use.datanode.hostname

聊聊复杂网络环境下hdfs的BlockMissingException异常|参数dfs.client.use.datanode.hostname 1 从一个复杂网络环境下的 hdfs 报错问题聊起 大家知道,企业真实的网络环境是复杂多变的,这可能有多种原因: 一方面,单台服务器可以…

国产32位单片机 普冉PY32F002B 适用于LED灯驱,控制器等

PY32F002B 系列单片机采用高性能的 32 位 ARM Cortex-M0内核,宽电压工作范围的 MCU。嵌入了24Kbytes Flash 和 3Kbytes SRAM 存储器,最高工作频率 24MHz。有TSSOP20, QFN20, SOP16, SOP14,MSOP10多种不同封装类型多款产品。 芯片集成了I2C、SPI、USART 等…

C#程序中很多ntdll.dll、clr.dll的线程

VS中调试缓慢,如下图 需要“右键工程——调试——取消勾选‘启用本地代码调试’”即可。

划片机是用于半导体芯片和其它电子元件切割的设备

划片机是用于半导体芯片和其它电子元件切割的设备。在电子行业中,划片机广泛应用于半导体器件、LED芯片、功率器件等多个领域。通过划片机,可以将芯片或其它电子元件从其母片或衬底上切割下来,以便进一步的使用和加工。 半导体芯片是现代电子…

瑞芯微RK3568|SDK开发之环境安装及编译操作

1. SDK简介 一个通用 Linux SDK 工程目录包含有buildroot、app、kernel、device、docs、external 等目录。其中一些特性芯片如RK3308/RV1108/RV1109/RV1126等,会有所不同。 ● app:存放上层应用 app,主要是 qcamera/qfm/qplayer/settings 等…

Docker 安装MYSQL 5.7.38

首先创建临时容器 docker run -d -p 3318:3306 --name mysql -e MYSQL_ROOT_PASSWORD123456 mysql:5.7.38创建mysql文件挂载目录,然后从临时容器中拷贝出配置文件 mkdir -p /data/docker/mysql/log mkdir -p /data/docker/mysql/data mkdir -p /data/docker/mysql…

人力资源行业HR从业现状,这份报告了解下

人力资源(Human Resource ,简称HR)指在一个国家或地区中,处于劳动年龄、未到劳动年龄和超过劳动年龄但具有劳动能力的人口之和。或者表述为:一个国家或地区的总人口中减去丧失劳动能力的人口之后的人口。人力资源也指一定时期内组织中的人所拥…