jvm(1)

本文深入解析JVM内存结构,包括程序计数器、虚拟机栈、本地方法栈等关键组件的功能与作用。介绍它们如何支持Java多线程、方法执行及异常处理。

JVM--------程序计数器

程序计数器是运行时数据区域的一块小的内存空间。
程序计数器是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变程序计数器的值来选取下一条需要执行的指令。
注意:java的多线程实际上一个处理器(内核)在一个时间点上只能执行一条线程。因此,为了使线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器 ,各条线程之间互不影响,独立存储,因此称为线程私有。
如果线程正在执行一个java方法,程序计数器记录的是虚拟机字节码指令的地址。如果正在执行的是native方法,则为空。
程序计数器是唯一没有规定OutOfMemmoryError的情况的区域

JVM------------------虚拟机桟

与程序计数器一致,Java的虚拟机桟也是线程私有的,他的生命周期与线程相同。
虚拟机桟描述的是java方法执行的内存模型:每一个方法都在执行的时候创建一个桟帧(注意:这里是创建桟帧,桟帧是方法运行时候的基础数据结构)。桟帧用来存储局部变量表,操作数桟,动态连接,方法出口等。
每一个方法从调用直至执行完成的过程,就是桟帧在虚拟机桟中入桟到出桟的过程
我们常说的桟其实就是虚拟机桟,确切的说是虚拟机桟中的桟帧中的局部变量表。
局部变量表中存放了8中基本的数据类型,以及对象的引用(A  a = new A()其中a变量为对象的引用存放在局部变量表中),其中long和double的数据会占用2个局部变量的空间,局部变量表中的内存空间是在编译期间就完成分配的,大小就是确定的,运行期间的大小不会对此改变
java虚拟机规范中对虚拟机桟有两种异常:
1.若线程请求的桟深度大于虚拟机所允许的深度,则抛出StackOverFlowError异常
2.若动态扩展虚拟机桟,若无法申请到足够的内存,就会抛出OutOfMemoryError异常


JVM------------------本地方法桟

首先解释下何为本地方法:
java的本地方法其实就是native关键字定义的方法。
Native方法常用于两种情况
1.在方法中调用一些不是由java语言所写的方法。
2.在方法中用java语言直接操作计算机硬件。
另外注意一点该native关键字不能和abstract关键字共同使用,因为abstract指明了方法没有实现题,而native指明了方法存在实现体。

本地方法桟的作用功能和虚拟机桟基本类似,只不过一个是执行的java方法,一个执行的是本地方法。在虚拟机规范中,本地方法桟使用的语言,使用方式和数据结构并没有强制的规定,虚拟机可以自由实现。如:sun公司的HotSpot虚拟机直接合并了本地方法桟和虚拟机桟。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值