0x00000000指令引用的内存不能为written_jvm的内存结构

news/2024/7/3 1:04:48

5aaef53076fa44249fa08628529cc041.png

Jvm的内存结构是理解jvm的基础,下面我用最浅显易懂的语言来分析一下jvm的内存结构,jvm内存分为五大块:

5eb968efc1dfbd493448add9983df3df.png

一:程序计数器:程序计数器是用来指示当前线程要执行哪条指令,并且在执行完该条指令后让程序计数器指向下一条指令,直到将程序执行完毕。指令需要靠cpu来执行,在多线程中,多个线程是通过轮流切换分配cpu的时间片而执行的,在切换时需要记录当前执行到了哪条指令以便将来继续执行,每一个线程都需要有自己的程序计数器,所以程序计数器是线程私有的内存

二:虚拟机栈:通常我们把jvm的内存粗略的分为堆和栈,其中的栈指的就是虚拟机栈,虚拟机栈也是线程私有的

虚拟机栈对应的是方法的内存区域,每个方法执行时都会创建一个栈帧,用来存储该方法的局部变量表,操作数栈,动态链接,方法返回地址:

b477fb4a5b536d7308aea2408b40f4b1.png

1. 局部变量表局部变量表中存储的是方法的参数和方法中定义的局部变量,在编译期间就为局部变量表分配好了内存空间。局部变量表中存储三种类型的数据:

(1) 基本数据类型

(2) 引用类型:指向一个对象在内存中的地址

(3) returnAddress类型:指向指令的地址(已经很少见了,指向异常处理的指令,现在已经由异常表代替)

2. 操作数栈:当虚拟机执行一些指令的时候会对操作数栈进行入栈或出栈的操作,比如iadd指令将两个数相加,会先将操作数栈中的两个数弹出来(出栈),相加后再压入栈(入栈)中。

3. 动态链接:在运行时常量池中存储了诸如类名,方法名,我们要找到目标类,执行相应的方法就需要用到动态链接,栈帧中有一个指向运行时常量池的引用,通过这个引用可以找到相应的类名和方法名,但是光知道名称是没法执行方法的,需要通过名称找到相应的类和方法在内存中的地址,这个过程就是动态链接。

4. 方法返回地址:当方法执行完以后如果有返回值,就会把这个返回值返回给该方法的调用者,方法的返回就是我们java中用到的return命令。方法返回之后调用者需要继续往下执行就需要知道要执行的地址,该地址就是方法返回地址,它被记录在了栈帧中,当然在发生异常的情况下不会有返回值,要继续执行的地址可以通过异常处理器表来确定。

虚拟机栈可能出现两种类型的异常:

1. 线程请求的栈深度大于虚拟机允许的栈深度会抛出StackOverflowError,(虚拟机栈空间不能动态扩展的情况下)

2. 如果虚拟机栈空间可以动态扩展(目前多数的虚拟机都可以),当动态扩展无法申请到足够的空间时会抛出OutOfMemory异常。

三:本地方法栈:本地方法栈与虚拟机栈的作用是一样的,区别在于虚拟机栈为虚拟机执行java方法服务,而本地方法栈为虚拟机执行native方法服务,native方法为本地方法,不是用java语言写的有可能是c或者c++写的,在jdk中就有很多c的代码,就是提供给本地方法来调用的。

四:堆:通常我们把jvm的内存粗略的分为堆和栈,其中的堆就是指它,它是虚拟机中占用内存最大的一块,是被所有线程共享的一块区域,它是用来存放对象实例的。是垃圾收集器管理的主要区域。

五:方法区:方法区也是被所有线程共享的一块区域,它存储的是类信息,常量,静态变量,编译后的字节码等信息。方法区中还有一块区域“运行时常量池“:运行时常量池中存储的是编译期生成的各种字面量和符号引用。字面量相当于Java里常量的概念,比如字符串,声明为final的常量值等,符号引用包括了:类和接口名,字段名,方法名。


http://lihuaxi.xjx100.cn/news/272087.html

相关文章

5 亿微博数据疑泄露,Python 爬虫如何避免踩天坑?

作者 | 马超来源 | CSDN(ID:CSDNnews)3月19日,默安科技CTO魏兴国发微博称,微博数据泄露了不少用户的手机号,当中涉及不少微博认证的明星和企业家。亦有网友在他的微博评论区表示:“有超过5.38亿…

拼手速抢红包!送大家现金红包!

信息发达的时代,吸取先进的技术理念,成本很低。选择一些优质的公众号,学习技术,汲取他们的理念,化为己用~愿大家一起成长~为了回馈粉丝,联合8个公众号作者,送360元的现金红包抽奖规则本号的读者…

vi 替换

为什么80%的码农都做不了架构师?>>> vi/vim 中可以使用 :s 命令来替换字符串。以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询。…

arduino小车前进代码_基于Arduino操纵杆扩展板Funduino制作机器人小车

在本篇文章中,我们将制作一款两轮遥控机器人小车,使用的组件包含nRF24L01模块、Arduino UNO和Funduino操纵杆扩展板组成的控制部分,Arduino nano开发板以及和一个用于控制直流电机的L298N电机驱动器。nRF24L01和L298N电机驱动器为机器人小车提…

缺失值填写

空值填充算法 简介 造成数据缺失的原因 现实世界中的数据异常杂乱,属性值缺失的情况经常发全甚至是不可避免的。造成数据缺失的原因是多方面的: 信息暂时无法获取。例如在医疗数据库中,并非所有病人的所有临床检验结果都能在给定的时间内得到…

好用到爆的 Java 技巧

点击上方“方志朋”,选择“设为星标”回复”666“获取新整理的面试文章来自:Lrwin的技术博客链接:http://lrwinx.github.io/2017/03/04/细思极恐-你真的会写java吗/本文不是一个吹嘘的文章,不会讲很多高深的架构,相反&…

程序猿惯用口头禅与内心真实 OS,快来看看你中招没?

作者 | 他二哥来源 | 腾讯技术工程滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS【end】◆精彩推荐◆推荐阅读百万人学AI:CSDN…

如何根据原理图画封装_生物水处理专用消泡剂是如何根据生物水处理工艺原理进行消泡的?...

生物水处理专用消泡剂是如何根据生物水处理工艺原理进行消泡的?水处理消泡剂厂家给出了专业的分析。随着可持续和环保的发展,对于工业污水处理提出了更高的要求。很多生产工业都会采用生物水处理技术,提高循环水的使用。因此生物水处理技术被…