Java JVM 堆、栈、方法区详解

目录

1. 栈

2. 堆

3. 方法区

4. 本地方法栈

5. 程序计数器


首先来看一下JVM运行时数据区有哪些。

1. 栈

在介绍JVM栈之前,先了解一下 栈帧 概念。

栈帧:一个栈帧随着一个方法的调用开始而创建,这个方法调用完成而销毁。栈帧内存放者方法中的局部变量,操作数栈等数据。

Java栈也称作虚拟机栈(Java Vitual Machine Stack),JVM栈只对栈帧进行存储,压栈和出栈操作。

Java栈是Java方法执行的内存模型。下面我们来看一个Java栈图。

Java栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,在栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、指向当前方法所属的类的运行时常量池(运行时常量池的概念在方法区部分会谈到)的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些额外的附加信息。

当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。

因此可知,线程当前执行的方法所对应的栈帧必定位于Java栈的顶部。

对于所有的程序设计语言来说,栈这部分空间对程序员来说是不透明的。 

栈内存的大小可以有两种设置,固定值和根据线程需要动态增长。

在JVM栈这个数据区可能会发生抛出两种错误。

  1. StackOverflowError 出现在栈内存设置成固定值的时候,当程序执行需要的栈内存超过设定的固定值会抛出这个错误。
  2. OutOfMemoryError 出现在栈内存设置成动态增长的时候,当JVM尝试申请的内存大小超过了其可用内存时会抛出这个错误。

总结

  1. 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象)。对象都存放在堆区中。
  2. 每个栈中的数据(基础数据类型和对象引用)都是私有的,其他栈不能访问。
  3. 栈分为3个部分:基本类型变量,执行环境上下文,操作指令区(存放操作指令).
  4. 在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。
  5. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

2. 堆

堆数据区是用来存放对象和数组(特殊的对象)。堆内存由多个线程共享。堆内存随着JVM启动而创建。

众所周知,Java中有一个很好的特性就是自动垃圾回收。垃圾回收就操作这个数据区来回收对象进而释放内存。

如果堆内存剩余的内存不足以满足于对象创建,JVM会抛出OutOfMemoryError错误。

总结

  1. 存储的全部是对象,每个对象包含一个与之对应的class信息–class的目的是得到操作指令。
  2. jvm只有一个堆区(heap)被所有线程共享,堆区中不存放基本类型和对象引用,只存放对象本身。
  3. 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。
  4. 缺点是,由于要在运行时动态分配内存,存取速度较慢。

3. 方法区

方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域。

在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。

在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。

当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。

4. 本地方法栈

一个支持native方法调用的JVM实现,需要有这样一个数据区,就是本地方法栈。

Java官方对于本地方法的定义为methods written in a language other than the Java programming language,就是使用非Java语言实现的方法,但是通常我们指的一般为C或者C++,因此这个栈也有着C栈这一称号。

一个不支持本地方法执行的JVM没有必要实现这个数据区域。

本地方法栈基本和JVM栈一样,其大小也是可以设置为固定值或者动态增加,因此也会对应抛出StackOverflowError和OutOfMemoryError错误。

在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。

5. 程序计数器

在通用的计算机体系中,程序计数器用来记录当前正在执行的指令,在JVM中也是如此。

程序计数器是线程私有,所以当一个新的线程创建时,程序计数器也会创建。

由于Java是支持多线程,Java中的程序计数器用来记录当前线程中正在执行的指令。

如果当前正在执行的方法是本地方法,那么此刻程序计数器的值为undefined。

注意这个区域是唯一一个不抛出OutOfMemoryError的运行时数据区。

 

参考自:https://blog.csdn.net/zhangqilugrubby/article/details/59110906

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript 学习笔记(WEB APIs Day1)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. JavaScript 学习笔记(Day1) 2. JavaSc…

[CISCN 2019华北Day2]Web1

[CISCN 2019华北Day2]Web1 wp 很遗憾的是,我在做这题时没有什么头绪。用 sqlmap 开最高等级也只扫出来库名,表名和列名扫不出来,就算直接指定表名和列名,还是扫不出来,sqlmap 测出来的方法是时间盲注。 推荐博客&…

游泳耳机有什么好处?四款适合水下听歌的优质游泳耳机分享

游泳是一项健康有益的运动,而搭配一副高质量的游泳耳机,更能在游泳过程中享受音乐的陪伴。本文将介绍游泳耳机的好处,并为大家推荐四款适合水下听歌的游泳耳机,让大家在游泳中拥有更加丰富的体验。 接下来跟我一起看看游泳耳机的好…

allegro画PCB如何将版图底板改大

Step->Designer Parameter Editor width和hight是你设置的版图高和宽,X和Y是你版图上负坐标的最大值。

PowerScale重磅升级,加速迈进AI时代

2024开年 给大伙报告一则好消息 Dell非结构化数据存储的扛把子 PowerScale迎来重大升级 第二代PowerScale全闪存系统 即将闪亮登场 此次升级主要涉及硬件、软件及与NVIDIA的合作关系三个方面,升级后的PowerScale有望成为第一个通过 NVIDIA DGX SuperPOD验证的以…

【电商API接口】电商卖家必看!电商数据源对接全攻略!收藏!

电商竞争白热化的今天,一个电商卖家往往会在多个平台铺设店铺来获取更多的客户。 不同的平台有不同的管理系统,因此,卖家们在做分析时需要从多个系统导出数据,比如各类电商平台(淘宝、京东......)、各类ER…

Linux安装ossutil工具且在Jenkins中执行shell脚本下载文件

测试中遇到想通过Jenkins下载OSS桶上的文件,要先在linux上安装ossutil工具,记录安装过程如下: 一、下载安装ossutil,使用命令 1.下载:wget https://gosspublic.alicdn.com/ossutil/1.7.13/ossutil64 2.一定要赋权限…

大数据开发之Hadoop(优化新特征)

第 1 章:HDFS-故障排除 注意:采用三台服务器即可,恢复到Yarn开始的服务器快照。 1.1 集群安全模块 1、安全模式:文件系统只接收读数据请求,而不接收删除、修改等变更请求 2、进入安全模式场景 1)NameNod…

kali下-MSF-ftp_login模块破解FTP账号及密码

一、环境准备 两台设备在同一个网络内 一台kali系统:192.168.10.128 一台winserver2016:192.168.10.132 二、MSF介绍 metasploit 全称是The Metasploit Framework,又称MSF,是Kali 内置的一款渗透测试框架,也是全球…

学习JavaEE的日子 day15 访问修饰符,Object,equals底层,final

Day15 1.访问修饰符 理解:给类、方法、属性定义访问权限的关键字 注意: 1.修饰类只能使用public和默认的访问权限 2.修饰方法和属性可以使用所有的访问权限 经验: 1.属性一般使用private修饰,因为封装 2.属性或者方法如果需要被子…

珠三角佛山哪里有抄数的公司汽车3d尺寸检测逆向建模三维扫描服务

在当今的汽车行业中,随着技术的不断进步,对汽车配件的精度和质量要求也越来越高。传统的测量和设计方法已经无法满足现代工业生产的需要。因此,汽车配件三维扫描及建模设计技术的出现,为汽车制造业带来了革命性的变革。 汽车配件三…

C++ Linux动态库的编译和调用

一、C动态库编译 采用g编译C动态库,命令如下: g -fPIC -shared -o 动态库名 cpp文件名1.1 关于fPIC选项 首先了解动态库的载入时重定位。 一般linux的可执行文件都是elf格式(一种二进制文件格式),在可执行文件的头部包…

在线App封装技术:HTML5的新生命

HTML5封装的魅力所在HTML5带来了丰富的多媒体功能、地理位置服务、离线存储等特性,使得Web应用的体验更加接近原生App。封装HTML5到App中,可以大大缩短开发周期,降低开发成本,并且一次编写,多平台运行,极大…

ant-desgin的table的上移、下移

文章目录 html部分函数部分 html部分 <a-table :columns"columns" :data-source"dataList" :loading"listLoading" :pagination"false"><template #bodyCell"{ column, record, index }"><template v-if&qu…

Xline v0.6.1: 一个用于元数据管理的分布式KV存储

Xline是什么&#xff1f;我们为什么要做Xline&#xff1f; Xline是一个基于Curp协议的&#xff0c;用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议&#xff0c;需要两次RTT才能完成一次请求。当部署在单个数据中心时&#xff0c;节点之间的延迟较低&a…

2024Java高频面试题之MQ消息中间件,面试都问些什么?(附详细答案)

最近很多同学问我有没有java学习资料&#xff0c;我根据我从小白到架构师多年的学习经验整理出来了一份50W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我公众号&#xff1a;“ Tom聊架构 ”&#xff0c; 回复暗号&#xff1a;“ 578”即…

(人才测评)招聘数据分析师的入职测评方案

现在是一个大数据的时代&#xff0c;我们的车载导航、淘宝购物、包括人才招聘、都是大数据的产物&#xff0c;然而光靠数据堆积是没用的&#xff0c;所以如何高效的进行数据挖掘与分析&#xff0c;就成了每一件企业思考的问题。 一、 数据分析师的基本工作标准 1、 平时需要…

信息化和数字化的本质区别是什么?

信息化和数字化的本质区别是什么&#xff1f; 谢邀。前两年流行”信息化“&#xff0c;网上铺天盖地都是关于”信息化“的文章&#xff0c;这两年开始流行起“数字化”&#xff0c;于是铺天盖地都是“数字化”的文章&#xff0c;从数字化和信息化这两个关键词热度趋势就可以看…

qemu安装踩坑记(源码编译make版

qemu安装踩坑记&#xff08;源码编译make版 【写在前面】 本篇文章写于6.27号&#xff0c;发现写完但没发博客2333 大家好这里是β-AS&#xff0c;或者也可以喊我贝塔&#xff0c;或许也可也喊我be7a 没有人会永远学qemu&#xff0c;但永远会有人踩坑.jpg 依旧推荐一首歌 -1…

如何使用JS逆向爬取网站数据

引言&#xff1a; JS逆向是指利用编程技术对网站上的JavaScript代码进行逆向分析&#xff0c;从而实现对网站数据的抓取和分析。这种技术在网络数据采集和分析中具有重要的应用价值&#xff0c;能够帮助程序员获取网站上的有用信息&#xff0c;并进行进一步的处理和分析。 基…