学院首页 软件应用 编程开发 创意设计 认证培训 软件论坛
ASP ASP.NET PHP JSP SQL MYSQL Java VB

您的位置:学院 >> 编程开发 >> Java >> Java 虚拟机结构基础研究之二


Java 虚拟机结构基础研究之二


天极IT资讯短信服务 电脑小技巧
资费:包月5元
手机:
介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。


  通过上一篇文章的介绍我们了解了JVM中数据类型以及数据区的知识,这篇我们会通过对JVM堆栈的帧的详细介绍了解方法执行的一些内幕。

  帧通常用于存储数据和部分结果,同时还用于执行动态链接、返回方法的返回值以及分发异常。

  帧在方法调用的时候被创建,在方法完成的时候销毁。它是在创建它的线程的JVM堆栈中分配到空间的,每个帧都有它自己的局部变量数组、操作数堆栈和一个当前方法所在的类的运行时常量池的引用。

  它的局部变量数组和操作数堆栈的大小是在编译的时候就确定了的,而且它是和它所联系的方法的代码一起提供的,因此它的数据结构的尺寸仅仅依赖于JVM的实现和方法调用时同时可以分配的内存。

  对于正在执行的方法而言只有一个帧是活动的,这个帧就是所谓的当前帧,它的方法就是当前方法,当前方法所在的类被定义为当前类。局部变量和操作数堆栈的操作通常和当前帧有关。

  如果一个帧所在的方法调用了另外的方法或者方法结束,那么该帧不再是当前帧。如果是调用另外的方法,那么一个新的帧会被创建并且在控制权转换到新方法时成为当前帧;如果是方法结束,如果有方法返回,当前帧将它的方法调用的结果传递给前一个帧,当前一个帧成为当前帧时当前帧被丢弃。

  需要注意的是由一个线程创建的帧是局部于该线程的,其它的线程不能引用它。

  每个帧都包含变量数组,也就是我们所熟知的局部变量数组。一个局部变量可以保存一个boolean、 byte、char、short、int、float、引用或者returnAddress值,一对局部变量才能保存一个long或者double值。

  局部变量是根据索引进行寻址的,第一个局部变量的索引是0。如果一个整型值介于0和局部变量数组的长度之间并且也只有在这个区间的时候它才会被作为局部变量数组的索引。

  long型或者double型的值占用两个连续的局部变量,这样的值可能只能使用较小的那个索引值进行寻址,例如,局部变量数组中索引为n的double变量值实际上占用n和n+1,但是局部变量n+1是不能读取的,它可以被写入,但是这样做会使得局部变量n的内容无效。JVM没有要求n是偶数,这就意味着double和long型值在局部变量数组中不必是64位对齐的,JVM的实现者可以决定使用适当的方式表示那样的值。

  JVM使用局部变量传递方法调用的参数,对于类方法调用(也就是static方法),所有的参数都是连续的存储在局部变量表中并且是从0开始的,对于实例方法调用,所有的参数也是连续的但是是从1开始的,局部变量0存储的是实例方法所在的类实例的引用。

  每个帧都包含一个后进先出的堆栈,也就是它的操作数堆栈。

  操作数堆栈在刚刚被创建的时候是空的,JVM提供指令从局部变量或者成员加载常量或者值到堆栈,其它的JVM指令从操作数堆栈提取操作数,操作它们并将结果放回操作数堆栈。操作数堆栈也用于准备传递给方法的参数以及接收方法的结果。

  例如一个iadd指令将两个int值相加,该指令要求它的前一条指令将它要相加的两个值压入操作数堆栈的最上面,它从操作数堆栈取出那两个值进行相加并将结果放回操作数堆栈。

  子计算可能是嵌套在操作数堆栈中的,产生的值可以被嵌入的计算使用。

  操作数堆栈的每一项都可以保存JVM的任何类型的值,包括long和double型的。

  操作数堆栈中的值必须根据其类型进行操作。下面的这些情况都是不可能的:压入两个int值而后续的操作将它们作为long型或者压入两个float值而后续的操作是iadd指令(该指令的操作对象是两个int型)。有一小部分JVM指令(例如dup和swap)将运行时数据区的值作为原始的值(raw value)进行操作而不考虑其类型,这些指令是以一种不能用于修改或者分解单独的值的方式定义的,这些对操作数堆栈操作的限制通过类文件验证进行了强制。

  在任何时候操作数堆栈都有其相应的深度,long或者double型的值是两个单位而其它的值是一个单位。

  每个帧都包含一个相应于当前方法的类型的运行时常量池的引用以支持方法代码的动态链接。类文件代码中的方法代码指的是被调用的方法以及通过符号引用可以访问的变量,动态链接将这些符号方法引用翻译为具体的方法引用、在必要的时候加载类以解析未定义的符号以及将变量访问翻译为那些变量的运行时位置在存储结构中的适当的偏移。方法和变量的晚期绑定使得方法使用到的其它类的变化可以破坏该代码的可能性更小。

  如果方法调用没有导致一个异常(无论是JVM抛出的还是代码显式抛出的)就被认为是方法调用正常结束。如果当前方法调用正常结束,那么一个值可能被返回给调用它的方法。

  在这种情况下,当前帧被用于恢复调用者的状态,包括它的局部变量和操作数堆栈以及适当增加程序计数器以跳过方法调用指令。方法调用者所在的帧的程序的执行正常的继续,如果有方法返回,返回值被压入帧的操作数堆栈。

  如果方法里面的一个JVM指令的执行引起JVM抛出一个异常并且那个异常在方法里面没有被处理就会导致方法调用突然结束,执行一个athrow指令也可以导致一个异常被显式的抛出并且如果那个异常没有被当前方法捕获也可以导致方法调用突然结束,一个突然结束的方法调用永远也不会向它的调用者返回一个值。

  一个帧可能会被像调试信息这样的与实现相关的特定信息扩展。


技术文章快速查找

栏目导航
软件应用
·操作系统 ·杀毒防黑 ·应用软件
·聊天软件 ·网络软件  
Web开发
·ASP ·JavaScript ·CGI
·JSP ·VbScript ·Web服务器
·PHP ·XML  
开发语言
·VB ·VC ·ASP.NET
·Java ·C/C++ ·Delphi
数据库开发
·MySQL ·SQL/Access ·PowerBuilder
·Oracle ·DB2  
网站设计
·Flash ·Dreamweaver ·HTML/CSS
·Fireworks ·FrontPage  
平面设计
·Photoshop ·CorelDraw ·AutoCAD
·FreeHand ·Illustrator ·3DsMAX
媒体动画
·Director ·Authorware ·Maya
·视频处理    


相关软件 产品库推荐
·笔记本 ·台式机 ·服务器
·数码相机 ·手机 ·GPS
·DV摄像机 ·MP3 ·MP4
·CPU ·硬盘 ·内存
·主板 ·显卡 ·显示器
·打印机 ·投影机 ·路由器

还没人留言,抢个先,哈哈!
对"Java 虚拟机结构基础研究之二"的评论 - 快速回贴
内容:
  [完成后可按Ctrl+Enter发布]

百度中 Java 虚拟机结构基础研究之二 相关内容
Google搜索中 Java 虚拟机结构基础研究之二 相关内容
雅虎中 Java 虚拟机结构基础研究之二 相关内容
Sogou搜索中 Java 虚拟机结构基础研究之二 相关内容

相关软件 最新回复帖子:

·AutoCAD打造精致三维鸟笼实例详解
·Photoshop自定义水晶字特效样式
·AutoCAD三维基础实例教程
·PS为黑背景长发美女照片抠图换背
·用Photoshop自制个性摩托车贴花小经验
·轻松几步将美女照片处理为手工素描
·巧用Photoshop画笔轻松绘制创意特效
·用Photoshop通道将模糊肖像照片清晰化
·照片处理:Photoshop修复残破照片
·PS CS2新增形状模糊滤镜绘制花布图案


  相关软件 Java 虚拟机结构基础研究之二相关文章
Java中文档对象模型DOM经验小结 JBuilder设计获取图片属性程序
JXTA技术网络协议慨述 WEB应用程序的测试与优化概述
JXTA技术的设计目标和层次结构 Java语言中两种异常的差别
JXTA技术与应用发展慨述 Java用户界面本地化实例探索
JFreeChart在Webwork中的应用 用Java Web服务打造聊天程序
J2EE应用程序打包与部署之三 Java中的抽象数据类型探讨
Java虚拟机结构基础研究之一 J2EE应用程序打包与部署之二
J2EE应用程序打包与部署之一 用Java实现HTTP断点续传
全面接触Java集合框架 用Java调用VC音量控制程序
Struts开发指南之其他Web构架 Struts开发指南之Taglib