JVM原理(一):JVM运行时数据区域的分析

1. 程序计数器

程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。

作用

在Java虛拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

线程私有,程序计数器是唯一一个不会内存溢出的区域,详情如下:

2. Java虚拟机栈

虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法出口等信息,执行完毕后就会出栈。


局部变量表

局部变量表存放了编译期可知的各种Java虚拟机基本数据类型、对象引用和returnAddress类型。

这些数据类型在局部变量表中的存储空间以局部变量槽(Slot)来表示,其中long、double会占用两个槽,局部变量表所需的内存空间在编译期间完成分配


异常

StackOverflowError异常:如果线程请求的栈深度大于虚拟机所允许的深度会抛出。

OutOfMemoryError异常:如果Java虚拟机栈容量可以动态扩展,当扩展时无法申请到足够的内存会抛出该异常。

值得注意的是,以上情况出现在Classic虚拟机上,但是Hotpot虚拟机的栈容量不可以扩展的,所以只会出现OOM。

3. 本地方法栈

本地方法栈和虚拟机栈是非常相似的,不同的是:虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。

本地方法:本地方法是由其它语言编写的,编译成和处理器相关的机器代码。


异常

同上。

4. Java堆

《Java虚拟机规范》中对Java堆的描述:所有的对象实例以及数组都应当在堆上分配。


特点:

  1. 是虚拟所管理的内存中最大的一块。

  2. Java堆是被所有线程共享的一块内存区域。

  3. Java堆也是垃圾收集器管理的内存区域,因此一些资料也将他称为“GC堆”


异常

如果在Java堆中没有内存完成分配,并且堆也无法再扩展时,Java堆会抛出OOM异常。

5. 方法区

方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。别名“非堆”。


历史

在JDK8以前,许多Java程序员更愿意把方法区称呼为“永久代”。


方法区的垃圾收集行为

《Java虚拟机规范》对方法区的约束是非常宽松的,同时垃圾收集行为在这个区域比较少出现。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载。但是这个区域的回收效果不是很好。


异常

如果方法区无法满足新的内存分配需求时,将会抛出OOM异常。

6. 运行时常量池

运行时常量池是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表,用于存放编译器生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法去的运行时常量池中。


动态性


异常

运行时常量池会受到方法区的内存限制,当常量池无法申请到内存时会抛出OOM异常。

7. 直接内存

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

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

相关文章

一站式企业服务平台能够帮助企业解决哪些问题?

近年来一站式企业服务平台备受区域政府及园区管理者的青睐,充当着区域政府或园区的千里眼和顺风耳,可以用来捕捉与区域经济发展相关的信息,也可以用来倾听企业的诉求,更是成为了区域深抓企业服务的多面手。 同时,一站式…

高电压技术-冲击高压发生器MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 冲击电压发生器是产生冲击电压波的装置,用于检验电力设备耐受大气过电压和操作过电压的绝缘性能,冲击电压发生器能产生标准雷电冲击电压波形,雷电冲击电压截波,标准操作冲击…

容器化spring boot应用程序

容器化spring boot应用程序有多种方式,如基于简单的Dockerfile,多阶段Dockerfile以及基于Docker Compose等,我们将逐步给大家介绍,本节主要介绍基于简单的Dockerfile进行容器化spring boot的应用程序。 创建Spring boot应用程序 …

未来科技中的RTK接收机应用探索

RTK实时差分定位技术(RTK,Real-Time Kinematic),作为高精度定位技术的一种重要手段,已经在地理测绘、测量工程、航空航天等领域取得了广泛应用。随着科技的不断发展,RTK导航接收机的应用领域也日益拓宽。首…

AI大模型日报#0628:谷歌开源9B 27B版Gemma2、AI首次实时生成视频、讯飞星火4.0发布

导读:AI大模型日报,爬虫LLM自动生成,一文览尽每日AI大模型要点资讯!目前采用“文心一言”(ERNIE-4.0-8K-latest)生成了今日要点以及每条资讯的摘要。欢迎阅读!《AI大模型日报》今日要点&#xf…

合并排序的数组

题目链接 合并排序的数组 题目描述 注意点 A的末端有足够的缓冲空间容纳BA和B都是排序的 解答思路 最初想到的是双指针,从小到大找到合并B时应该A相应位置应该插入的元素,因为在插入的过程中B的元素会替换A原有位置的元素,所以需要先将A…

营销翻车,杜国楹出面道歉,小罐茶的“大师作”故事仓皇结尾

“小罐茶,大师作”,这句slogan曾一度在央视平台长时间、高密度播放,成为家喻户晓的广告词,也打响了小罐茶品牌的名号。但同时,市场上关于“大师作”真实性的质疑也从未停息。 就在6月25日小罐茶十二周年发布会上&#…

Jenkins容器的部署

本文主要是记录如何在Centos7上安装docker,以及在docker里面配置tomcat、mysql、jenkins等环境。 一、安装docker 1.1 准备工作 centos7、VMware17Pro 1.2 通过yum在线安装dokcer yum -y install docker1.3 启动docker服务 systemctl start docker.service1.4 查看docke…

JavaSE期末复习速成笔记

面向对象 1. 面向对象的概念 面向对象编程(OOP)是一种编程范式,它将现实世界的事物抽象为对象,通过类和对象来创建各种功能模块,以此来设计和开发软件。 2. 类与对象 类:是对象的模板,定义了…

自动化巡检革命:旗晟双圆管轨道机器人的创新应用

在输煤皮带线和矿山带式输送机的巡检过程中,面临着高湿度、多粉尘、温湿度极端、噪音干扰;设备磨损频繁,难以及时发现问题;传统的人工巡检方式存在劳动强度大、效率低、检测质量不稳定、数据采集和分析滞后,无法实现实…

oracle 11g rac创建实例时发现只给一节点创建了实例 二节点没创建的处理方法

由于操作失误没有在二节点创建实例 删除数据库重新dbca建库 [oracleracdg1-1 dbs]$ dbca -silent -deleteDatabase -sourceDB rac11dg1 -sysDBAUserName sys -sysDBAPassword oracle_4U Connecting to database 4% complete 9% complete 14% complete 19% complete 23% …

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 两个字符串间的最短路径(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…

npm创建一个空的vue3项目的方法或者pnpm创建vue3项目

1、前提我们已经安装了npm,或者pnpm 2、我们用npm来创建vue3项目 快速上手 | Vue.js 官网地址 这里我安装是的 node v18.20.3 以下是安装过程 : npm create vuelatest 根据自己的需要进行创建即可。 3、我们用pnpm来创建vite vue3项目 pnpm create …

Android 界面库 (二) 之 Data binding 详细介绍

1. 简介 回顾我们在前面文章《Android 界面库 (一) 之 View binding 简单使用》中学习的 View Binding,它旨在简化 View 与代码之间的绑定过程。它会在编译时期为每个 XML 布局文件生成相应的绑定类(Binding class),该类里包含了布局文件每个有 ID 的 Vi…

【深度学习】服务器炼丹代码配置、Python使用指定gpu显卡运行代码

【显卡】服务器炼丹代码配置 写在最前面一、查看哪几块显卡能用二、使用指定gpu运行代码1、指定使用GPU0运行脚本(默认是第一张显卡, 0代表第一张显卡的id,其他的以此类推)2、指定使用多张显卡运行脚本 三、如何使用1、单块显卡使用2、多GPU训练使用Data…

昇思25天学习打卡营第3天|数据集全攻略:加载、操作与自定义

导入数据集相关库和类 首先,导入了 NumPy 库,并将其简称为 np 。要知道,NumPy 乃是用于科学计算的关键库,作用非凡。接着,从 mindspore.dataset 当中导入了 vision 模块。此外,还从 mindspore.dataset 里引…

小阿轩yx-Nginx 网站服务

小阿轩yx-Nginx 网站服务 由俄罗斯的 lgor Sysoev 开发其稳定、高效的特性逐渐被越来越多的用户认可 Nginx 服务基础 Nginx (发音为[engine x])专为性能优化而开发 最知名的优点 稳定性低系统资源消耗以及对 HTTP 并发连接的高处理能力(单台物理服务器可支持 30000~50000个…

抗击.michevol勒索病毒:保障数据安全的新策略

导言: 在今天高度互联的数字化环境中,数据安全面临着越来越复杂和普遍的威胁,勒索病毒如.michevol已成为了用户和企业普遍面临的风险。本文91数据恢复将探讨.michevol勒索病毒的特点、感染方式以及创新的防御策略,旨在帮助读者更…

车载双向认证框架设计

最近工作需要,手写了一个双向认证库,可以用在Java、Android上,不限于PC/手机、车载平台。首先我们来看看双向认证的原理机框架设计思路,最后会给出下载链接大家可以体验或者源码参考。 因为可以和FlexNet网络库(参考我…

mac安装navicate

1.下载好之后点击安装包安装 2.一般情况下会提示安全性什么的,点击允许即可,然后会出现如下界面,点击安装即可. 3.点击打开 4.然后出现如下界面,点击Enter 5.将安装包拖入即可. 6.等待安装即可 7.安装完成后会在启动台看到Navicat16 的图标 8.然后打开软件界面如下: