当前位置: 首页 > article >正文

JVM的组成--运行时数据区

JVM的组成

1、类加载器(ClassLoader)

类加载器负责将字节码文件从文件系统中加载到JVM中,分为:加载、链接(验证、准备、解析)、和初始化三个阶段

2、运行时数据区

运行时数据区包括:程序计数器、虚拟机栈、堆、本地方法栈、方法区(元空间)

3、执行引擎

执行引擎负责将字节码(.class)解释或编译为机器码并执行。包括:解释器、即时编译器(JIT)、垃圾回收器

4、本地方法接口

本地方法接口提供JVM与本地方法库(如C/C++库)的交互能力,使得Java程序可以调用本地方法

一 程序计数器

程序计数器 :是线程私有的,内部保存字节码(.class文件)的行号。用于记录正在执行的字节码指令的地址

由于是线程私有的,所以不会有线程安全问题

使用javap -v xx.class 可以打印堆栈大小,局部变量的数量和方法的参数

可以看到如下图:

class的每一行都被解析成更多的执行命令(指令),每一行前面都有一个行号(地址),记录程序已经执行到哪一行

有什么用呢?比如:当线程1 执行到第10行,这个时候如果CPU被线程2抢走了

等到下次执行的时候,线程1不必从头执行,直接从第10行继续执行

这就是程序计数器的作用

二 堆

堆是线程共享的区域,主要用来保存对象实例,数组等大的、或者生命周期长的对象,当那个堆中没有内存空间可分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常

既然是线程共享的区域,就说明可能有线程安全的问题

如图所示,堆分为两块区域

1、年轻代:分为Eden区,两个大小严格相同的Survivor区S0和S1

根据GC的策略,在经过几次垃圾回收后,仍然存活于Survivor区的对象将被移动到老年代

2、老年代:主要保存一些声明周期长的对象,一般是一些老的对象

三 虚拟机栈

Java Virtual machine Stacks(Java虚拟机栈):

1、是每个线程运行时所需的内存,称为虚拟机栈,先进后出,一般会用来存储局部变量、方法调用

保存局部变量表、操作数栈、动态链接和方法出口等信息

2、如果有多个线程,则会创建多个虚拟机栈,因此只要是在虚拟机栈内,则是线程安全的

每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存,一个方法一个栈帧

当方法调用方法时,就会在栈中,出现一条栈帧链

3、每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

如图:方法1调用方法2,方法2调用方法3

则方法1的栈帧,就会先进入栈中,然后调用方法2,方法2的栈帧进入栈中,其次是方法3的栈帧3

最后:当方法3执行完毕,则方法3的栈帧先弹出(弹栈),然后是方法2的栈帧2,最后是栈帧1

3.1 垃圾回收是否涉及栈内存?

不涉及,垃圾回收指的是 回收 堆内存,当栈帧弹栈以后,内存就会释放

3.2 栈内存分配越大越好吗?

未必,默认的栈内存通常为1024K,也就是1MB

栈帧过大会导致线程数变少,例如,机器总内存为512MB,目前能活动的线程数就为512个(每个线程1MB),但是如果把栈内存改为2048K,也就是2MB,那么能够活动的栈帧就会减半

3.3 方法内的局部变量是否线程安全?

上面说到,在同一个虚拟机栈内,是线程安全的,但是就一定能说明方法内的局部变量是线程安全的吗?

不一定

如果方法内的局部变量没有逃离方法的作用范围,则这个局部变量是线程安全的

如果是局部变量引用了对象,并逃离方法的作用范围,则需要考虑线程安全的问题

3.4 栈内存会溢出吗

栈内存是线程私有的,会有内存溢出的问题吗?

有的兄弟,有的

1、栈帧过多导致的内存溢出,典型问题:递归调用

如下的无限递归调用,会导致栈帧有无限多个,导致栈内存溢出

2、栈帧过大导致栈内存溢出

这个不太容易出现,因为一个栈帧一般最大可以有1MB的内存大小,一般不会溢出

3.5 堆和栈的区别是什么

1、栈内存一般会用来存储局部变量、方法调用;但是堆内存是用来存储Java对象和数组的。

堆会GC垃圾回收,而栈不会

2、栈内存是线程私有的,而堆内存是线程共有的

3、两者内存溢出的报错不同:

栈空间不足:java.lang.StackOverFlowError

堆内存不足:java.lang.OutOfMemoreError

四 方法区(元空间)

1、方法区(Method Area)是各个线程共享的内存区间,用的是本地内存,也就是操作系统的内存

注意,是操作系统中的内存

2、主要存储类的信息、运行时常量池等

3、虚拟机启动的时候创建,关闭虚拟机时释放

4、如果方法区的内存无法满足分配请求,则会抛出OutOfMemoryError:MetaSpace

元空间是没有上限的,除非达到虚拟机内存的大小,或者你手动设值一个元空间的最大值

比如你通过如下命令:-XX:MaxMetaspaceSize=8m

修改元空间最大值为8MB,然后你开一个循环,使用ClassWriter加载10000个类,就可能把元空间撑爆:

MaxMetaspaceSize is too small

4.1 直接内存是什么?

直接内存不属于JVM的内存结构,不由JVM进行管理。是虚拟机的系统内存

常见于NIO操作时,用于数据缓冲区,分配回收成本较高,但读写能力高,不受JVM内存回收管理

因为Java代码是无法直接操作内存的,只能通过建立一个java缓冲区byte[],拷贝系统缓存区的数据,所以会比直接NIO操作直接内存来的慢

五 本地方法栈

本地方法栈(Native Method Stack)是JVM中为执行本地方法(Native Method)而准备的一块内存区域。本地方法指的是使用Java以外的语言(例如C或C++)编写,并通过JNI(Java Native Interface)或其他方式被Java程序调用的方法。

如果你在jdk中看到native修饰的方法,那么就是本地方法

相关文章:

JVM的组成--运行时数据区

JVM的组成 1、类加载器(ClassLoader) 类加载器负责将字节码文件从文件系统中加载到JVM中,分为:加载、链接(验证、准备、解析)、和初始化三个阶段 2、运行时数据区 运行时数据区包括:程序计数…...

c++进阶之------红黑树

一、概念 红黑树(Red-Black Tree)是一种自平衡二叉查找树,它在计算机科学的许多领域中都有广泛应用,比如Java中的TreeMap和C中的set/map等数据结构的底层实现。红黑树通过在每个节点上增加一个颜色属性(红色或黑色&am…...

《鸿蒙原生应用开发:掌控Ability生命周期的艺术》

在鸿蒙原生应用开发的广袤天地中,Ability作为构建应用的基本单元,其生命周期的有效管理宛如基石之于高楼,是打造稳定、高效且用户体验卓越应用的关键所在。随着鸿蒙生态的蓬勃发展,深入理解并巧妙运用Ability生命周期,…...

ubuntu22.04安装搜狗输入法保姆教程~

一、添加中文语言支持 1.首先打开设置,找到Language and Region 2.点击Manage Installed Languages 3.点击 Install/Remove Languages... 4.选中Chinese (simplified),点击Apply...

《数据库原理》SQLServer期末复习_题型+考点

目录 题型: 一. 概况分析题(5小题,每小题2分,共10分) 二. 计算题(3小题,每小题5分,共15分) 三. 数据库设计(2小题,每小题10分,共2…...

Zstd(Zstandard)压缩算法

要压缩的数据量越小,压缩的难度就越大。这个问题对所有压缩算法都是通用的,原因是压缩算法从过去的数据中学习如何压缩未来的数据。但是,在新数据集开始时,没有“过去”可以构建。 官网 为了解决这种情况,Zstd 提供了一…...

烧结银技术赋能新能源汽车超级快充与高效驱动

烧结银技术赋能新能源汽车超级快充与高效驱动 在新能源汽车领域,高压快充技术的突破与高功率密度驱动系统的创新正成为行业竞争的焦点。比亚迪于 2025 年发布的超级 e 平台,通过整合全域千伏高压架构、兆瓦级闪充技术及碳化硅(SiC&#xff0…...

本地部署 browser-use

本地部署 browser-use 0. 引言1. 核心功能与优势2. 快速上手3. 部署 Gradio UI4. 更多示例0. 引言 Browser-Use 是一个强大的工具,旨在让 AI Agent 能够控制浏览器,从而实现各种自动化任务。它简化了 AI 与浏览器的交互,让开发者能够轻松构建能够执行网页操作的智能应用。本…...

笔记:代码随想录算法训练营day59:110.字符串接龙 、105.有向图的完全可达性、106.岛屿的周长

学习资料:代码随想录 110. 字符串接龙 卡码网题目链接(ACM模式) 还是有些许复杂,要把字符串从begin开始遍历,然后把每一个字母都换一下,看能否在字典里找到,如果能找到就入队列并记录&#x…...

电力和冷却管理:如何让数据中心“高效降温”同时节能增效

电力和冷却管理:如何让数据中心“高效降温”同时节能增效 数据中心作为现代信息技术基础设施的核心,承担着处理、存储和传输海量数据的重任。然而,这些庞大的服务器和存储设备在高速运转时,不仅需要大量电力供应,还产生了大量热量。如何平衡电力消耗与有效冷却,成为了数…...

Vite管理的Vue3项目中monaco editer的使用以及组件封装

文章目录 背景环境说明安装流程以及组件封装引入依赖封装组件 外部使用实现效果 v-model实现原理 背景 做oj系统的时候,需要使用代码编辑器,决定使用Monaco Editor,但是因为自身能力问题,读不懂官网文档,最终结合ai和网友的帖子成功引入&…...

查找重复代码[A卷-hw_od]

题目描述 小明负责维护项目下的代码&#xff0c;需要查找出重复代码&#xff0c;用以支撑后续的代码优化&#xff0c;请你帮助小明找出重复的代码。 重复代码查找方法&#xff1a;以字符串形式给定两行代码&#xff08;字符串长度 1 < length < 100&#xff0c;由英文字…...

HAl库开发中断方式接收Can报文的详细流程

下面给出一个基于 HAL 库的中断方式接收 CAN 报文的详细流程说明&#xff0c;描述每一步的硬件配置、软件调用和中断处理机制&#xff0c;而不涉及具体代码细节&#xff0c;只讲解整体原理和步骤&#xff1a; 在使用 HAL 库时&#xff0c;不需要手动清除中断标志位。原因如下&…...

[笔记] TinyWebServer编译及demo运行过程

文章目录 前言环境搭建ubuntumysql 8.0c/c开启root用户TinyWebServer 搭建及编译过程运行结果常见问题./threadpool/../CGImysql/sql_connection_pool.h:6:10: fatal error: mysql/mysql.h: No such file or directory./server运行后直接退出了 前言 哎 也就帮帮新手看看问题 …...

基于springboot的电影院管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 互联网技术的成熟和普及&#xff0c;势必会给人们的生活方式带来不同程度的改变。越来越多的经营模式中都少不了线上运营&#xff0c;互联网正强力推动着社会和经济发展。国人对民族文化的自信和不同文化的包容&#xff0c;再加上电影行业的发展&#xff0c;如此繁荣吸引…...

基于Redis分布锁+事务补偿解决数据不一致性问题

基于Redis的分布式设备库存服务设计与实现 概述 本文介绍一个基于Redis实现的分布式设备库存服务方案&#xff0c;通过分布式锁、重试机制和事务补偿等关键技术&#xff0c;保证在并发场景下库存操作的原子性和一致性。该方案适用于物联网设备管理、分布式资源调度等场景。 …...

虚拟电商-延迟任务系统的微服务改造(二)注册中心和Feign调用

一、微服务注册中心Consul 编写完延迟任务系统的web层接口&#xff0c;也就是说可以基于http协议来访问延迟系统&#xff0c;接下来要将延迟任务改造成一个服务。首要考虑的问题就是服务的注册与发现&#xff0c;服务的注册与发现都离不开服务的注册中心&#xff0c;本项目选取…...

数智读书笔记系列022《算力网络-云网融合2.0时代的网络架构与关键技术》读书笔记

一、书籍核心价值与定位 1.1 书籍概述:中国联通研究院的权威之作 《算力网络 —— 云网融合 2.0 时代的网络架构与关键技术》由中国联通研究院算力网络攻关团队精心撰写,是业界首部系统性探讨云网融合 2.0 与算力网络的专著。在云网融合从 1.0 迈向 2.0 的关键节点,本书的…...

人工智能在智能交通中的应用:以L4级无人电动物流拖车为例

一、引言 人工智能&#xff08;AI&#xff09;技术的飞速发展正在深刻改变各个行业&#xff0c;其中智能交通领域尤为显著。从自动驾驶汽车到智能交通管理系统&#xff0c;AI的应用不仅提高了交通效率&#xff0c;还增强了安全性。本文将重点探讨L4级无人电动物流拖车技术及其在…...

【愚公系列】《高效使用DeepSeek》024-儿童教育

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...

第十六届蓝桥杯康复训练--6

题目链接&#xff1a;790. 数的三次方根 - AcWing题库 思路&#xff1a;二分&#xff0c;注意正负号和小数判断退出的方法&#xff08;虽然正负无所谓&#xff09; 代码&#xff1a; #include<bits/stdc.h> using namespace std;#define exs 0.00000018812716007232667…...

【QA】单件模式在Qt中有哪些应用?

单例设计模式确保一个类仅有一个实例&#xff0c;并提供一个全局访问点来获取该实例。在 Qt 框架中&#xff0c;有不少类的设计采用了单例模式&#xff0c;以下为你详细介绍并给出相应代码示例。 1. QApplication QApplication 是 Qt GUI 应用程序的核心类&#xff0c;每个 Q…...

logisim安装以及可能出现的问题

阅读提示&#xff1a;我这篇文章更偏向于安装出现问题的解决方案 目录 一、安装步骤 二、安装问题 1、出错的问题 2、出错的原因与解决方法 一、安装步骤 1、下载logisim 官方网站&#xff1a;https://sourceforge.net/projects/circuit/ 下载适用于你操作系统的版本&…...

Servlet、HttpServletRequest、HttpServletResponse、静态与动态网页、jsp、重定向与转发

DAY15.2 Java核心基础 JavaWeb 要想通过浏览器或者客户端来访问java程序&#xff0c;必须通过Servlet来处理 没有Servlet&#xff0c;java是无法处理web请求的 Web交互&#xff1a; 接收请求HttpServletRequest&#xff1a;可以获取到请求的信息&#xff0c;比如uri&#…...

2300年直线公理使数学一直存在尖锐自相矛盾

2300年直线公理使数学一直存在尖锐自相矛盾 黄小宁 复平面z各点z的对应点2z的全体是2z平面。z面拉伸&#xff08;平移&#xff09;变换为2z面&#xff08;z2面&#xff09;就使x轴⊂z面沿本身拉伸&#xff08;平移&#xff09;变换为u2x轴&#xff08;ux2轴&#xff09;。R可…...

hackmyvm-Icecream

arp-scan -l nmap -sS -v 192.168.222.106 enum4linux 192.168.222.106 445端口 smbmap -H 192.168.222.106 icecream为只读模式 smbclient \\192.168.222.106\icecream 反弹shell(上传put php-reverse-shell.php) 开启监听 nc -lnvp 1234 拿到webshell cat /etc/passwd 9000端…...

Apache Tomcat漏洞公开发布仅30小时后即遭利用

近日&#xff0c;Apache Tomcat曝出一项安全漏洞&#xff0c;在公开发布概念验证&#xff08;PoC&#xff09;仅30小时后&#xff0c;该漏洞即遭到攻击者利用。这一漏洞编号为CVE-2025-24813&#xff0c;主要影响以下版本&#xff1a; 1. Apache Tomcat 11.0.0-M1 至 11.0.2 …...

告别低效人工统计!自动计算计划进度

实时监控任务进度一直是项目管理中的一项巨大挑战。 人工统计方式不仅耗时耗力&#xff0c;而且往往由于信息传递的延迟和人为误差&#xff0c;导致无法实时获得准确的项目进展信息。 这种不准确性可能掩盖潜在的风险点&#xff0c;从而影响项目的整体进度和成果。 Ganttable …...

AI比人脑更强,因为被植入思维模型【16】反脆弱

毛选中就有言&#xff0c;不经历困难&#xff0c;我们就不会掌握战胜困难的方法。 这个世界纷繁复杂&#xff0c;不是强者总是运气好&#xff0c;而是他们能够失败后快速复原&#xff0c;不断找到战胜困难的方法。 定义 马斯洛需求层次模型是一种将人类需求从低到高按层次进…...

L2TP实验

放开安全策略机制&#xff0c;FW1不配IP [FW1]firewall zone trust [FW1-zone-trust]add interface GigabitEthernet 1/0/0 [FW1]security-policy [FW1-policy-security]default action permit FW2 和FW3 [FW2]interface g1/0/1 [FW2-GigabitEthernet1/0/1]ip address 2…...