JVM-运行时数据区

运行时数据区

JAVA虚拟机所管理的内存划分的区域就是运行时数据区

组成

运行时数据区

1.程序计数器

当字节码解释器(也就是虚拟机)在运行一条一条字节码的时候,就是通过改变这个程序计数器来选取下一条执行的指令。还有异常处理,线程恢复等都是靠线程计数器。

对于处理器的一个内核来说,多线程是通过线程轮流切换实现的,并不是真正意义的同时进行(只是切换的贼快让你感觉是同时在跑),在某一个时间点上,只会执行一条线程上的指令,而线程间切换后,如何回到切换前执行的位置,也是靠程序计数器。线程飞速切换这种花里胡哨的操作下,只有每条线程都给他整一个计数器,而且只属于当前线程使用,才能保证准确的又回到最初的起点,呆呆的站在…咳咳,所以这块区域是线程私有的,只属于自己的小助手🤓

此内存区域是唯一一个在虚拟机规范中没有指定任何的内存溢出(outOfMemoryError)的区域

2.虚拟机栈

栈帧

这玩意也是线程私有的东西,生命周期与线程共存亡。
他是干啥用的呢,每次执行一个方法的时候,就会在里面创建一个栈帧,装着你方法里面的局部变量表操作数栈动态连接方法出口等东西。可以想象一个弹夹😏,是一个装栈帧(子弹)的容器,最先调用的方法生成的栈帧(子弹),往里面塞,然后根据顺序调用到的方法依次往弹夹里面装,先塞的子弹就被压到了最下面,所以返回的时候,就是从最后塞进去的栈帧开始出栈。

对于JVM执行引擎来说,在在活动线程中,只有位于JVM虚拟机栈栈顶的元素才是有效的,即称为当前栈帧,与这个栈帧相关连的方法称为当前方法,定义这个方法的类叫做当前类

2.1 局部变量表

先来瞅瞅里面装了啥?

  • 编译期可知的各种基本数据类型(boolean,byte,char,short,int,float,long,double)
  • 对象引用(reference类型)我理解他就是一个定位到对象的坐标或者指针
  • returnAddress类型(指向一条字节码的指令)
2.2 操作数栈

当一个方法执行的时候,这里是空的,随着方法里面字节码指令运行,可能会多次进行入栈出栈的操作,他进进出出的干嘛呢,主要是做一些计算,返回计算后的值

操作数栈主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。

2.3 动态连接

在一个class文件中,一个方法要调用其他方法,需要将这些方法的符号引用转化为其在内存地址中的直接引用,而符号引用存在于方法区中的运行时常量池。
Java虚拟机栈中,每个栈帧都包含一个指向运行时常量池中该栈所属方法的符号引用,持有这个引用的目的是为了支持方法调用过程中的动态连接(Dynamic Linking)。
这些符号引用一部分会在类加载阶段或者第一次使用时就直接转化为直接引用,这类转化称为静态解析。另一部分将在每次运行期间转化为直接引用,这类转化称为动态连接。

2.3 方法返回

尘归尘土归土,一个方法完成后,不管是异常退出,还是正常结束退出,他都要回到执行方法前的地方,然后改变计数器,接着执行字节码指令。所以它就是存一定位信息,比如说返回地址😏

3.本地方法栈

虚拟机栈刚搞完。怎么又来个这玩意,来来来,我倒要see一下你又是何方妖孽?
额,别紧张,都是自家兄弟,我跟虚拟机栈差卵不多,区别只是在于我不服务本地人,我只服务老外
说人话!
额,好嘛,虚拟机栈是服务java方法的,而我是服务于native方法…别冲动,放下刀等我说完,native方法就是java里面调用的其他语言的方法。
就这?退下,下一个!
emmmm…

4.Java堆

这块地方大家就都是老朋友了,他是线程共享的
几乎所有的对象实例都在这里分配内存,而他的唯一目的,也就是存放对象实例,垃圾回收的地方主要就在这里,关于垃圾回收具体后面单独再说。
java虚拟机规范中规定,java堆可以处于物理上不连续的内存,只要逻辑上是连续的即可

4.方法区

线程共享的区域,老问题,这里放了什么呢?
存储了已被虚拟机加载的类信息,常量,静态变量,编译器编译后的代码等
这里同样可以进行垃圾回收,但是因为基本上不存在回收,所以也有个外号叫做“永久代”

4.1运行时常量池

它属于方法区的一部分
Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池( Constant Pool Table), 用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的 运行时常量池中存放,哦,对了,还有翻译出来的直接引用也在这里放着。
不一定是在编译期间才能产生常量池中的东西,运行中也会产生

肝不动了😪,一些具体解释后面再补充,主要是让自己加深学习印象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值