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,一经查实,立即删除!

相关文章

ASP.NET 使用web.config配置文件的system.webServer/modules标签实现登录验证

前言 modules 标签允许你添加、删除或配置在 IIS 中运行的 HTTP 模块。HTTP 模块是处理 HTTP 请求和响应的组件,它们可以在请求处理管道的不同阶段执行代码。某些 system.webServer 中的设置可能只适用于 IIS 的特定模式(如集成模式)&#x…

Git拉取、切换分支等操作

当你在本地计算机上通过 git clone 命令克隆了一个 Git 仓库后,你会得到一个与远程仓库相对应的本地副本。这个本地副本包含了远程仓库的所有历史记录、分支、标签等。接下来,我会详细解释在该目录下启动 Terminal 并使用 Git 命令来查看和切换分支&…

【FPGA】Verilog 中的 genvar 和 generate 语句教程

在 Verilog 中,generate 语句用于生成多个结构化的代码块,这些代码块可以是循环(使用 for)或条件生成(使用 if)。genvar 是一个在 generate 块中使用的变量,用于迭代生成实例。 什么是 genvar&…

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

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

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

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

SHELL脚本学习(十三)初识 gawk 编辑器

概述 gawk提供了一种编程语言,而不仅仅是编辑器命令。 在gawk语言中,可以实现如下操作: 定义变量保存数据使用算数和字符串运算符处理数据使用结构化编程概念 为数据处理添加处理逻辑提取文件中的数据并将其重新排列组合,最后生…

注解详解系列 - @Bean:定义Spring管理的Bean

注解简介 在今天的注解详解系列中,我们将探讨Bean注解。Bean是Spring提供的一个注解,用于在Java配置类中显式定义一个Spring管理的Bean。通过Bean注解,可以灵活地定义和配置Bean,从而增强应用程序的可维护性和可测试性。 注解定义…

python_时间戳对齐

需求 python 有2个保存时间戳的list, listA 和 listB, 对于listA中的每一个时间戳元素cur_ts, 查找listB中 与cur_ts最接近的前后两个时间戳元素 代码 import bisect# 示例数据 listA [1, 5, 10, 15] listB [2, 6, 8, 12, 14, 18]def find_closest_…

容器化spring boot应用程序

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

SOLID:软件系统设计的五个基本原则

SOLID 是面向对象设计和编程中的五个基本原则的首字母缩写,旨在鼓励更加灵活和可维护的软件设计。SOLID 原则可以帮助我们更好地理解和实施某些设计模式。 SOLID 原则包括以下五个方面: 单一职责原则(Single Responsibility Principle, SRP&…

Java零基础-集合:Collections

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

未来科技中的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…

【高考】选专业时以什么为主?

【高考】选专业时,应避免的误区-CSDN博客 【高考】选专业时以什么为主?-CSDN博客 分数限制下,选好专业还是选好学校?-CSDN博客 分数限制下,选好专业还是选好学校?-CSDN博客 分数限制下,选好专…

合并排序的数组

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

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

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

大数据面试题之HBase(2)

目录 列式数据库的适用场景和优势?列式存储的特点? HBase的rowkey设计原则 HBase的rowkey为什么不能超过一定的长度?为什么要唯一?rowkey太长会影响Hfile的存储是吧? HBase的RowKey设置讲究有什么原因 HBase的大合并、小合并是什么? HBase和关系型数据库(传统数…

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. 类与对象 类:是对象的模板,定义了…

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

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