《自己动手写Java虚拟机》学习笔记(四)运行时数据池

第四章 运行时数据池

本章来初步实现运行时数据区。

4.1 运行时数据区概述

运行时数据区可以分为两类:多线程共享,线程私有。多线程共享的运行时数据区需要在java虚拟机启动时创建好,在jvm退出时销毁;线程私有的则随线程生而生,随线程亡而亡。

多线程共享的内存区域存放两类数据:类数据和类实例(即:对象)。类数据是放在Method Area中的,对象数据是放在Heap中的。堆由垃圾收集器定期清理,所以程序员不用关心对象空间的释放。类数据包括字段和方法信息、方法的字节码、运行时常量池等等,从逻辑上讲,方法区其实是堆的一部分。

线程私有的运行时数据区用于辅助执行java字节码。每个线程都有自己的pc寄存器和java虚拟机栈。java虚拟机栈又由栈帧(Stack Frame)构成,帧中保存方法执行的状态。包括局部变量表(Local Variable)和操作数栈(Operand Stack)等。在任意一个时刻,某一线程肯定是在执行某个方法。这个方法叫做该线程的当前方法;执行该方法的帧叫做线程的当前帧;声明该方法的类叫做当前类。如果执行的是java方法,则pc寄存器中存放的是正在执行的java虚拟机执行的地址;否则,当前方法是本地方法,pc寄存器中的值没有明确定义。

如图所示:

本章将初步实现线程私有的运行时数据区。

4.2 数据类型

jvm可操作两类数据,基本类型和引用类型。基本类型的变量存放的就是数据本身,引用类型的变量存放的是对象引用,真正的对象数据是在堆里面分配的。这里所说的变量包括类字段(静态字段)、实例字段(非静态字段)、数据元素、方法参数、局部变量等等。

基本类型可以进一步分为布尔类型和数字类型。数字类型又可分为整数类型和浮点数类型。引用类型可进一步分为类类型、接口类型和数组类型。其中,类类型引用指向类实例;数组类型引用指向数组实例,接口类型引用指向实现了该接口的类或数组实例。引用类型有一个特殊的值——null,表示该引用不指向任何对象。

4.3 实现运行时数据区

jvm对于java虚拟机栈约束宽松,java虚拟机栈可以连续,也可以不连续;可以固定大小,也可运行时动态拓展。

(以下描述请借助上图。)

对于Thread,我们需要给他针对PC的getter/setter,针对Stack的Frame的pop、push与top(取得栈顶帧)。(对于Stack的Frame操作仅仅是一层包装,方便外部使用)。

对于jvm虚拟机栈,需要给他Frame的pop、push、top。

对于帧,暂时只需要给他new的方法。

对于局部变量表。首先他是按照索引访问的,因此可以使用数组描述。对于其中每一个项,我们称呼他为Slot。

对于每一个Slot,他包含num字段(存放整数)和ref字段(存放引用)。那么他需要new方法和对于int、float、long、double、ref五种类型的setter和getter。注意long需要拆分成两个int,而double可以转化成long存储。

对于操作数栈。他的做法与局部变量表类似。

4.4局部变量表和操作数栈实例分析

public static float circumference(float r) {
    float pi = 3.14;
    float area = 2 * pi * r;
    return area;
}

该方法的局部变量表大小是3,操作数栈深度为2。(由jvm确定)

假设调用方法时,除啊给他的参数是1.6f。则:

(#0代表的是1.6)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值