黑马程序员JVM系列学习——运行时数据区(一)

线程不共享:每个线程都会有一份程序计数器,Java虚拟机栈,本地方法栈对应的数据,别的线程无法访问,安全性高。

线程共享:每个线程都可以获取方法区和堆区的数据。

1.程序计数器(PC寄存器)

存放接下来要执行的字节码指令的地址。

控制程序指令的执行,实现分支、跳转、异常等逻辑;多线程时Java虚拟机通过程序计数器记录CPU切换前执行到哪一句指令并继续执行。

2.栈

Java虚拟机栈:保存在Java中实现的方法,每次执行方法会将方法的信息保存到栈中。

本地方法栈:在方法上加上native,用C++来实现的方法。

只使用一个栈来保存上述两个不同的方法信息。

栈帧的组成:局部变量表、操作数栈、帧数据

局部变量表:保存运行时的所有局部变量

如果是非静态方法,则必须实例化,0号位置存放实例对象的地址,即this,占用一个槽,如果有参数则参数紧跟着this,然后是方法体里的局部变量。

操作数栈:虚拟机在执行指令过程中用来存放临时数据的一块区域

在编译器就可以确定操作数栈的最大深度,如最长的表达式为a+b+1,则操作数栈最大深度为3,类推。

帧数据:主要包含动态链接、方法出口以及异常表的引用 

动态链接:类的生命周期,连接阶段将符号引用转化为内存地址的直接引用。如果当前类的字节码指令引用了其他类的属性或方法时,需要将符号引用转化为运行时的常量池中的内存地址,动态链接就保存了编号到运行时常量池的内存地址的映射关系。其数据主要保存的是其他类的属性或方法的映射数据。字节码指令可根据符号引用快速找到运行时常量池对应的数据。

方法出口:在方法正确或者异常结束时,当前栈帧被弹出,程序计数器应指向上一个栈帧中的下一条指令的地址,所以当前栈帧中,需要存储此方法的出口地址。

异常表:代码中的异常处理信息,包含了异常捕获的生效范围以及异常发生后跳转到的字节码指令位置。

 Java虚拟机栈如果栈帧过多,超过分配的最大大小则会出现内存溢出。出现StackOverflowError错误。

设置栈空间大小:-Xss 栈da

本地方法栈:

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值