深入理解java虚拟机-第入章

第8章 虚拟机字节码执行引擎

8.2 运行时栈帧结构

  栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。

  每一个栈帧包括了局部变量表、操作数栈、动态连接、方法返回地址和一些额外的附加信息。

  在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧 Current Stack Frame,与这个栈帧相关联的方法称为当前方法。

  局部变量表:

  Local Variable Table是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。

  在Java程序编译为Class文件时,就在方法的Code属性中确定了该方法所需要分配的局部变量表的最大容量。

  局部变量表的容量以变量槽(slot)为最小单位。

  在方法执行时,虚拟机是使用局部变量表完成参数值到参数变量列表的传递过程。

  如果执行的是实例方法(非static的方法),那局部变量表中第0位索引的Slot默认用于传递方法所属对象实例的引用,在方法中可以通过关键字“this”来访问这个隐含的参数,其余参数则按照参数顺序排列,占用从1开始的局部变量slot.

  操作数栈:

  Operand Stack也常称为操作栈,它是一个后入先出(Last In First Out, LIFO)栈。

  当一个方法刚刚开始 执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是入栈、出栈操作。

  例:整数加法的字节码指令iadd在运行时操作数栈中最接近栈顶的两个元素已经存入了两个int型的数据,当执行这个指令时,会将这两个int值出栈并相加,然后将相加的结果入栈。

  动态连接:

  每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接.

  方法返回地址:

  当一个方法开始执行后,只有两上方式可以退加该方法:

  1 执行引擎遇到任意一个方法返回的字节码指令,正常退出

  2 在方法执行过程中出现异常,并且这个那异常没有在方法体内得到处理。

  附加信息:

 8.3方法调用

  方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法)

  解析:

  所有方法调用中的目标方法在Class里面都是一个常量池中的符号引用,会将其中的一部分符号引用转化为直接引用。主要包括静态方法和私有方法两大类。

  分派:

  分派调用过程将为揭示多态特征的一些最基本的体现。

  1、静态分派

  Human man = new Man();

  虚拟机在重载时是通过参数的静态类型(Human)而不是实际类型( Man )作为判定依剧的。 

  虚拟机会根据类型进行自动类型转换或装箱,可变长参数的重载优先级是最低的。

  2、动态分派

  与多态性的另一个重要体现 重写 override 有着很密切的关联。在判断是调用父类中的方法还是子类中的覆盖的方法时,根据对父类实例化的子类的不同,调用不同子类中覆写的方法。

  3、单分派与多分派

  方法的接收者与方法的参数统称为方法的宗量。单分派是根据一个宗量对目标方法进行选择,多分派则是根据多于一个宗量对目标方法进行选择。

  Java1.6是一门静态多分派、动态单分派的语言。

  4、虚拟机动态分派的实现

  由于动态分派是非常频繁的动作,因此为类的方法区中建立一个虚方法表。

  虚方法表中存放着各个方法的实际入口地址,如果子类没有重写父类的方法,那么入口是一致的。

  如果子类重写了,那么子类方法中的地址将会替换为子类的实现版本的入口地址。

时间: 2024-10-03 15:01:27

深入理解java虚拟机-第入章的相关文章

深入理解java虚拟机-第六章

第6章 类文件 6.3 Class类文件的结构 Class文件是一组以8位字节为基础单位的二进制流. Class文件格式采用一种类似C语言结构伪结构存储数据,这种伪结构中只有两种数据类型:无符号数和表 无符号数属于基本的数据类型以u1,u2,u4,u8来分别代表一个字节.2个字节,4个字节.8个字节的无符号数,无符号数可以用来描述数字.索引引用.数量值或者按照UTF-8编码构成字条串值. 表是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表习惯性地以 _info 结尾. 表 Clas

深入理解java虚拟机-第七章

第7章 虚拟机类加载机制 类的加载的时机 加载 Loading, 连接 Linking(验证 Verfiication, 准备Preparation, 解析 Resolution) 初始化 Initialization, 使用Using和卸载 Unloading 类加载的过程: 1,加载: 加载是“类加载" class loading过程珠一个阶段,在加载阶段,虚拟机需要完成以下3个事情. 1 通过一个类的全限定名来获取定义此类的二进制字节流 2 将这个字节流所代表的静态存储结构转化为方法区的运

深入理解java虚拟机-第四章

第4章 虚拟机性能监按与故障处理工具 jps 虚拟机进程状况工具 jstat 虚拟机统计信息监视工具 JVM Statistics Monitoring Tool jstat [ option vmid [interval[s|ms] [count]] jstat -gc 2764 250 20 其中option的选项: -class  -gc  -gccapacity -gcutil ...... jinfo java配置信息工具 jmap Java内在映射工具 用于生成堆转储快照 也可配置

深入理解java虚拟机-第12章Java内存模型与线程

第12章 Java内存模型与线程 Java内存模型  主内存与工作内存: java内存模型规定了所有的变量都在主内存中,每条线程还有自己的工作内存. 工作内存中保存了该线程使用的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行. 内存间交互操作: 1 lock 作用于主内存的变量,它把一个变量标识为一个线程独占的状态. 2 unlock 作用于主内存的变量,把锁定的变量释放出来 3 read 作用于工作内存的变量,把一个变量的值从主内存传输到线程的工作内存中. 4 load 作用于工作

深入理解java虚拟机-第三章

1.概述 2.对象已死吗? 引用计数器 给对象添加一个引用计数器,每当有引用时,计数器加1,引用失效时,计数器减1:任何时刻计数器为0的对象就是不可能再被使用的. 若对象是循环引用,则无法处理.JVM不使用. 可达性分析算法 通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所经过的路径称为引用链(Reference Chain),当一个对象没有任何引用链相连时,表明该对象不可用. Java语言中,可作为 GC Roots的对象包括如下: 虚拟机栈(栈帧中的本地变

深入理解java虚拟机-第13章-线程安全与锁优化

第十三章 线程安全与锁优化 线程安全 java语言中的线程安全 1 不可变.Immutable 的对象一定是线程安全的 2 绝对线程安全 一个类要达到不管运行时环境如何,调用者都不需要额外的同步措施,通常需要付出很大甚至是不切实际的代价,在java api中标注自己是线程安全的类,大多数都不是绝对的线程安全 3 相对线程安全 4 线程兼容  对象本身不是线程安全的,但是可以通过在调用端正确地使用同步手段来保证对象在并发环境中可以安全使用 5 线程对立 线程安全的实现方法 1 互斥同步 Murua

《深入理解Java虚拟机》读书笔记——第1章 走近Java

(注:原文请见<深入理解Java虚拟机>周志明 著,知识点部分参考百度百科) 总述 第1章分为两个部分:Java概述及自己动手编译JDK的教程. 1 Java概述 介绍了Java的整体特性.Java的技术体系组成.Java及JVM的发展史. 1.1 Java的总体特性 1)Java不仅仅是一门编程语言,更是由一系列计算机软件和规范组成的技术体系. 2)Java具有众多优点: a.Java虚拟机在千差万别的物理机上建立了统一的运行平台,实现了跨平台性.(主要) b.提供了相对安全的内存管理和访问

《深入理解Java虚拟机》读书笔记---第二章 Java内存区域与内存溢出异常

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来.这一章就是给大家介绍Java虚拟机内存的各个区域,讲解这些区域的作用,服务对象以及其中可能产生的问题. 1.运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 1.1程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型中里,字

《深入理解Java虚拟机》读书笔记---第一章 走进Java

一.为什么要读此书 <深入理解Java虚拟机>这本书读了很多次,每次读都会有不一样的感受.首先说一下为什么要读这本书,如果把Java比喻成乾坤大挪移,那了解虚拟机的工作原理就是练习九阳神功,java语言是招式,对虚拟机的认识是内功心法,只有内功心法强大,所使的招式才强大,这就是为什么阳顶天只能把乾坤大挪移练到第四层,而张无忌能练到第七层.由于java虚拟机的强大,把很多功能都隐藏了,例如内容管理,垃圾回收机制等,使得很多java程序猿对这一块的知识所有缺失,编码的时候也是似懂非懂的,以至于遇到