java虚拟机规范

(这些知识都是在学习java反编译的过程当中涉及到的。由于java虚拟机规范晦涩难懂,硬着头皮读下去。连蒙带猜,勉强理解一部分,可能
 很多地方理解的不正确或者不够好,还请老师指正)
 java虚拟机,顾名思义。它不是一种物理计算机。与其他虚拟机一样,java虚拟机是在物理计算机上面用软件模拟的方式来实
现类似计算机的功能的抽象计算机。但是java虚拟机并不是一个软件,而是一系列规范标准。java虚拟机规范详细规定了java
虚拟机各个部分的应有格式和法则。这和冯诺依曼提出的计算机模型很相似。我们可以通过java语言规范的一些概念来理解理
解java虚拟机规范,我们可以认为java虚拟机规范是一种接口,实现此接口的软件称为java虚拟机实现。Sun公司的java虚拟机
就是一个典型的满足规范的java虚拟机实现。除此之外,微软曾发布的MS java虚拟机和android所用的java虚拟机都是java虚拟
机的具体实现(google和oracle正在打官司,个人感觉android并没有侵权,毕竟具体的实现不同)。
 java虚拟机是由寄存器,指令集,栈,垃圾回收器,方法区组成。
 java虚拟机寄存器主要保存了程序的运行状态,分为四种:
 PC寄存器,程序计数器,可以理解方法的执行的计数器。每个java虚拟机线程都有他自己的PC寄存器,包含当前执行方法执行的
java虚拟机指令地址。
 optop寄存器:它是指向操作数栈顶的指针。在执行方法栈的时候需要他。
 frame寄存器:指向java方法运行的环境,也就框架的指针。
 vars寄存器:java方法在执行的时候会用数组按照前后顺序存储局部变量,vars寄存器就是指向当前方法局部变量数组的第一个
元素的指针(方法栈可以根据vars寄存器指针的偏移量来寻找局部变量的地址)。
 java虚拟机的栈:
 java虚拟机在执行方法的时候会生成栈,方法的Class文件中是用符号表示所要访问的变量和调用的方法。通过动态链接把这些
符号翻译成实际方法同时装载所需的类用来解释Class文件中的符号。如果方法正常返回,就会恢复该方法的调用者得寄存器。并将
PC寄存器增加某个数值,跳过已经调用的方法,继续执行。
 垃圾回收器:
 java虚拟机规范只规定了必须实现对java堆中无用的对象收集并释放,但没有规定具体的算法。
 
 java虚拟机指令集:
 java虚拟机指令集类似于物理计算机的CUP指令集,定义虚拟机基本的操作指令。一个java虚拟机指令由一个字节的指定操作操作码后面
加上包含该操作所需要的参数或数据的操作数。指令也可以不需要操作数。
 
 异常:
  程序在运行时有两种情况会抛出异常。动态链接时异常,比如无法找到Class文件,非法的Class文件等。运行时异常,比如空指针异常,
程序使用throws关键字。当异常抛出时会检查与当前方法联系的catch语句,如果该异常类型与catch语句能够匹配(引起异常的指令在catch
语句所描述指令的范围内,并且异常异常类型是catch语句处理的类是同类或者是其子类),则跳转到异常处理代码块中。如果没有匹配则继续
寻找该方法的下一个catch语句。直到查找玩所有的catch子句。如果还没有匹配,则恢复方法调用者得状态(寄存器的数据信息),继续传播异常
直到找到匹配的catch语句。如果异常传播到最顶层仍然没有找到与之匹配的catch语句,系统则调用缺省的异常处理块。
 常数池是.class文件的运行期表示,是在.class文件中是静态的描述,包含编译器已知的数值,和运行期所要解析的方法,类等信息。java虚拟
机在成功加载.class文件后,就会根据.class中的描述为每个类创建常量池。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值