【JVM】什么是运行时数据区?

news2024/11/17 5:55:09

什么是运行时数据区?

运行时数据区指的是JVM所管理的内存区域,其中分成两大类:
线程共享 – 方法区、堆
方法区:存放每一个加载的类的元信息、运行时常量池、字符串常量池。
堆:存放创建出来的对象。

线程不共享 – 本地方法栈、虚拟机栈、程序计数器
本地方法栈和虚拟机栈都存放了线程中执行方法时需要使用的基础数据。
程序计数器存放了当前线程执行的字节码指令在内存中的地址。

直接内存主要是NIO使用,由操作系统直接管理,不属于JVM内存

程序计数器

程序计数器(Program Counter Register)也叫PC寄存器,每个线程会通过程序计数器记录当前要执行的的字节码
指令的地址。主要有两个作用:

1、程序计数器可以控制程序指令的进行,实现分支、跳转、异常等逻辑

2、在多线程执行情况下,Java虚拟机需要通过程序计数器记录CPU切换前解释执行到那一句指令并继续解释运行。

栈 - Java虚拟机栈

Java虚拟机栈采用栈的数据结构来管理方法调用中的基本数据,先进后出 ,每一个方法的调用使用一个栈帧来保存。
每个线程都会包含一个自己的虚拟机栈,它的生命周期和线程相同.

栈帧主要包含三部分内容:
1、局部变量表,在方法执行过程中存放所有的局部变量。
2、操作数栈,虚拟机在执行指令过程中用来存放临时数据的一块区域。
3、帧数据,主要包含动态链接、方法出口、异常表等内容

动态链接:方法中要用到其他类的属性和方法,这些内容在字节码文件中是以编号保存的,运行过程中需要替换成
内存中的地址,这个编号到内存地址的映射关系就保存在动态链接中。
方法出口:方法调用完需要弹出栈帧,回到上一个方法,程序计数器要切换到上一个方法的地址继续执行,方法出
口保存的就是这个地址。
异常表:存放的是代码中异常的处理信息,包含了异常捕获的生效范围以及异常发生后跳转到的字节码指令位置。

本地方法栈

⚫ Java虚拟机栈存储了Java方法调用时的栈帧,而本地方法栈存储的是native本地方法的栈帧。
⚫ 在Hotspot虚拟机中,Java虚拟机栈和本地方法栈实现上使用了同一个栈空间。本地方法栈会在栈内
存上生成一个栈帧,临时保存方法的参数同时方便出现异常时也把本地方法的栈信息打印出来

⚫ 一般Java程序中堆内存是空间最大的一块内存区域。创建出来的对象都存在于堆上。
⚫ 栈上的局部变量表中,可以存放堆上对象的引用。静态变量也可以存放堆对象的引用,通过静态变量就可以实
现对象在线程之间共享。
⚫ 堆是垃圾回收最主要的部分,堆结构更详细的划分与垃圾回收器有关

方法区

方法区是Java虚拟机规范中提出来的一个虚拟机概念,在HotSpot不同版本中会用永久代或者元空间来实现。方法
区主要存放的是基础信息,包含:
1、每一个加载的类的元信息(基础信息)。
2、运行时常量池,保存了字节码文件中的常量池内容,避免常量内容重复创建减少内存开销。
3、字符串常量池,存储字符串的常量。

直接内存

直接内存并不在《Java虚拟机规范》中存在,所以并不属于Java运行时的内存区域。在 JDK 1.4 中引入了 NIO 机
制,由操作系统直接管理这部分内容,主要为了提升读写数据的性能。在网络编程框架如Netty中被大量使用。
要创建直接内存上的数据,可以使用ByteBuffer。
语法: ByteBuffer directBuffer = ByteBuffer.allocateDirect(size);

哪些区域会出现内存溢出,会有什么现象?

内存溢出指的是内存中某一块区域的使用量超过了允许使用的最大值,从而使用内存时因空间不足而失败,虚拟机一般
会抛出指定的错误。
在Java虚拟机中,只有程序计数器不会出现内存溢出的情况,因为每个线程的程序计数器只保存一个固定长度的地址。

堆内存溢出:
堆内存溢出指的是在堆上分配的对象空间超过了堆的最大大小,从而导致的内存溢出。堆的最大大小使用-Xmx参数进
行设置,如-Xmx10m代表最大堆内存大小为10m。

溢出之后会抛出OutOfMemoryError,并提示是Java heap Space导致的:

栈内存溢出:
栈内存溢出指的是所有栈帧空间的占用内存超过了最大值,最大值使用-Xss进行设置,比如-Xss256k代表所有栈帧占用
内存大小加起来不能超过256k
溢出之后会抛出StackOverflowError

方法区内存溢出:
方法区内存溢出指的是方法区中存放的内容比如类的元信息超过了方法区内存的最大值,JDK7及之前版本方法区使用永
久代(-XX:MaxPermSize=值)来实现,JDK8及之后使用元空间(-XX:MaxMetaspaceSize=值)来实现。
元空间溢出:

永久代溢出:

直接内存溢出:
直接内存溢出指的是申请的直接内存空间大小超过了最大值,使用 -XX:MaxDirectMemorySize=值 设置最大值。
溢出之后会抛出OutOfMemoryError:

哪些区域会出现内存溢出,会有什么现象?
内存溢出指的是内存中某一块区域的使用量超过了允许使用的最大值,从而使用内存
时因空间不足而失败,虚拟机一般会抛出指定的错误。
堆:溢出之后会抛出OutOfMemoryError,并提示是Java heap Space导致的。
栈:溢出之后会抛出StackOverflowError。
方法区:溢出之后会抛出OutOfMemoryError,JDK7及之前提示永久代,JDK8及之
后提示元空间。
直接内存:溢出之后会抛出OutOfMemoryError

JVM在JDK6-8之间在内存区域上有什么不同 – 方法区的实现

⚫ 方法区是《Java虚拟机规范》中设计的虚拟概念,每款Java虚拟机在实现上都各不相同。Hotspot设计如下:
⚫ JDK7及之前的版本将方法区存放在堆区域中的永久代空间,堆的大小由虚拟机参数来控制。
⚫ JDK8及之后的版本将方法区存放在元空间中,元空间位于操作系统维护的直接内存中,默认情况下只要不超过操作系统承受的上限,可以一直分配。也可以手动设置最大大小。

使用元空间替换永久代的原因:
1、提高内存上限:元空间使用的是操作系统内存,而不是JVM内存。如果不设置上限,只要不超过操作系统内存上限,就可以持续分配。而永久代在堆中,可使用的内存上限是有限的。所以使用元空间可以有效减少OOM情况
的出现。
2、优化垃圾回收的策略:永久代在堆上,垃圾回收机制一般使用老年代的垃圾回收方式,不够灵活。使用元空间之后单独设计了一套适合方法区的垃圾回收机制。

JVM在JDK6-8之间在内存区域上有什么不同 – 字符串常量池的位置

早期设计时,字符串常量池是属于运行时常量池的一部分,他们存储的位置也是一致的。后续做出了调整,将字符串常量池和运行时常量池做了拆分

字符串常量池从方法区移动到堆的原因:
1、垃圾回收优化:字符串常量池的回收逻辑和对象的回收逻辑类似,内存不足的情况下,如果字符串常量池中的常量不被使用就可以被回收;方法区中的类的元信息回收逻辑更复杂一些。移动到堆之后,就可以利用对象的垃圾回收器,对字符串常量池进行回收。
2、让方法区大小更可控:一般在项目中,类的元信息不会占用特别大的空间,所以会给方法区设置一个比较小的上限。如果字符串常量池在方法区中,会让方法区的空间大小变得不可控。
3、intern方法的优化:JDK6版本中intern () 方法会把第一次遇到的字符串实例复制到永久代的字符串常量池中。JDK7及之后版本中由于字符串常量池在堆上,就可以进行优化:字符串保存在堆上,把字符串的引用放入字符串常量池,减少了复制的操作

                                                                       JDK6

                                                                    JDK7

                                                                           JDK8

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

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

相关文章

VB+ACCESS学籍管理系统-264-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword264 设计要求: 第一:一篇论文(5000到10000字)不包括图表和程序代码。A4纸20页之内。 论文结构如下: 设计题目:学籍管理系统 附:程…

Jeff Bezos的投资正开始见效

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

计算机组成原理练习-计算机硬件组成

冯诺依曼结构计算机 1.冯诺依曼结构计算机中数据采用二进制编码表示,其主要原因是()。 I.二进制的运算规则简单 Ⅱ.制造两个稳态的物理器件较容易 Ⅲ.便于用逻辑门电路实现算术运算 A.仅I、Ⅱ B.仅I…

Spring具体拓展点:后置处理器

一图胜千言 mermaid示例图: #mermaid-svg-YEqFb5JcEk5FWkwO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YEqFb5JcEk5FWkwO .error-icon{fill:#552222;}#mermaid-svg-YEqFb5JcEk5FWkwO .error-text{fi…

如何注册Devin-首个全自主AI软件工程师

最近devin大火,具体的就不说了,大家应该都知道,写代码非常nb,这里说一下devin的注册方式,目前devin的内测已经开启。 官网https://www.cognition-labs.com/blog注册网址Your reliable AI software engineerhttps://pr…

腾讯云服务器地域选择方法,神仙教程,看这一篇就够了

腾讯云服务器地域怎么选择?不同地域之间有什么区别?腾讯云哪个地域好?地域选择遵循就近原则,访客距离地域越近网络延迟越低,速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素,地域节点选择…

Windows C++ 使用WinAPI实现RPC

demo下载地址:https://download.csdn.net/download/2403_83063732/88958730 1、创建IDL文件以及acf文件(创建helloworld.idl helloworld.acf) 其中IDL文件: import "oaidl.idl"; import "ocidl.idl"; [ …

C++_day3:构造函数、析构函数、拷贝构造函数

1.设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 程序代码&#xff1a; #include <iostream>…

L2-034: 口罩发放(Python)

为了抗击来势汹汹的 COVID19 新型冠状病毒&#xff0c;全国各地均启动了各项措施控制疫情发展&#xff0c;其中一个重要的环节是口罩的发放。 某市出于给市民发放口罩的需要&#xff0c;推出了一款小程序让市民填写信息&#xff0c;方便工作的开展。小程序收集了各种信息&…

Github 2024-03-14 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目9非开发语言项目1TypeScript项目1Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42…

基于java+springboot+mybatis+laiyu实现学科竞赛管理系统

基于javaspringbootmybatislaiyu实现学科竞赛管理系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获…

Hackthebox - Scrambled- linux

Recon Port Scan HTTP 80 根据在 support 页面得到的信息&#xff1a; 邮箱 supportscramblecorp.com用户名 ksimpson一个用于连接 4411 端口的软件密码 ksimpson SMB 445 这里连接 SMB 服务是连不上的&#xff0c;因为禁用了 NTLM MSSQL 1443 SQL 服务也同样 Unkn…

下载指定版本的pytorch

下载网址&#xff1a;https://download.pytorch.org/whl/torch_stable.html 参考博客网址&#xff1a;https://blog.csdn.net/wusuoweiieq/article/details/132773977

【代码随想录 | 链表 04】删除链表的倒数第N个节点

文章目录 4.删除链表的倒数的第N个节点4.1题目4.2解法&#xff1a;双指针 4.删除链表的倒数的第N个节点 19.删除链表的倒数第N个节点 4.1题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例一&#xff1a; 输入&#xff1a;h…

github拉取项目找不到前端代码

今天从github上拉取了一个项目&#xff0c;使用docker部署在了服务器上&#xff0c; 代码正常运行&#xff0c;但是想在下载的项目中找前端代码遇到了问题&#xff0c;项目结构中的template模板只有一个页面&#xff0c;于是查看nginx配置文件 查看index.html 引入了一些js文件…

24GB内存就能跑7B参数大模型?全新训练策略GaLore助你突破内存瓶颈

训练大型语言模型&#xff0c;内存总是个大问题。 权重啊、优化器状态啊&#xff0c;都得吃内存&#xff0c;而且吃得还不少。 为了省内存&#xff0c;有人就想出了一些招儿&#xff0c;比如低秩适应&#xff08;LoRA&#xff09;&#xff0c;就是给预训练权重添点儿可训练的…

EasyRecovery恢复电脑丢失数据怎么样?

电脑是我们大家熟悉并且常用的数据存储设备&#xff0c;也是综合性非常强的数据处理设备。对于电脑设备来讲&#xff0c;最主要的数据存储介质是硬盘&#xff0c;电脑硬盘被划分成多个分区&#xff0c;在电脑上表现为C盘&#xff0c;E盘等&#xff0c;用来保存系统文件以及其他…

UDP通讯测试

参考资料&#xff1a;UNIX网络编程 实验平台&#xff1a;PC为client&#xff0c;RaspberryPi为server 基本类型和接口函数&#xff0c;参考man手册 #include <sys/socket.h>struct sockaddr {sa_family_t sa_family; /* Address family */char sa_d…

LDK加密狗的多种功能特点

LDK加密狗是一种在软件保护领域广泛应用的硬件加密设备&#xff0c;它为软件提供了强有力的版权保护&#xff0c;确保软件开发商的权益得到充分保障。本文将从LDK加密狗的工作原理、功能特点、应用场景以及未来发展等方面进行详细阐述。 LDK加密狗的工作原理基于硬件加密技术。…

2 配置虚拟机

1.打开VM&#xff0c;主页的界面如下&#xff0c;点击"创建新的虚拟机" 2.选择“自定义&#xff08;高级&#xff09;”&#xff0c;然后点击下一步&#xff0c;如下图所示&#xff1a; 3.下图直接点击“下一步” 4.下图的界面上&#xff0c;注意&#xff0c;不要选择…