JVM学习笔记

本文深入探讨了Java虚拟机的内部体系结构,包括对象池、方法池、对象引用转换、实例方法调用的动态绑定,以及Java栈帧的组成和作用。详细解释了每个部分的功能和工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java虚拟机内部体系结构:

虚拟机必须能够通过对象引用得到类数据:当程序在运行时需要转换某个对象引用为另一种类型时,虚拟机必须检查这种转换是否被允许,被转换的对象是否的确是被引用的对象或者是它的超类型。当程序在执行instanceof操作时,虚拟机也能进行同样的检查。最后,当程序中调用某个实例方法时,虚拟机必须动态绑定。

划分为对象池和方法池的对象如下:

保持对象数据在一起的方式如下:

对于一个运行中的Java程序而言,其中每一个线程都有自己的PC寄存器,它是该线程启动时创建的,PC寄存器的大小是一个字长,因此它可以持有一个本地指针,也可以持有一个returnAddress。当程序执行某个java方法时,PC寄存器的值总是下一条将被执行的指令的地址。如果线程正在执行一个本地方法,那么此时PC寄存器的值是“undifined”。

     每当线程调用一个Java方法时,虚拟机都会在该线程的Java栈中压入一个新帧,而这个新帧自然就成为了当前帧。在执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等等数据。Java方法可以以两种方式完成:return和抛异常,两种情况都会将当前帧弹出Java栈。Java栈上所有的数据都是此线程私有的。栈帧的结构如下:

  1. 局部变量区:Java栈帧中的局部变量区组织成字长为单位的数组:int、float、reference和returnAddress占一项,byte、short和char的值在存入数组前将被转换成int值,long和double占两项(其中第一个参数是偷偷塞进去的this)。
  2. 操作数栈:通过标准的压入、弹出来操作,参数的处理与局部变量区相同。
  3. 帧数据区:Java栈帧需要一些数据来支持常量池解析、正常方法的返回和异常机制的派发。这些信息都保存在Java栈帧的帧数据区中。

转载于:https://www.cnblogs.com/ggzwtj/archive/2012/03/06/2369701.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值