深入理解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、虚拟机动态分派的实现
由于动态分派是非常频繁的动作,因此为类的方法区中建立一个虚方法表。
虚方法表中存放着各个方法的实际入口地址,如果子类没有重写父类的方法,那么入口是一致的。
如果子类重写了,那么子类方法中的地址将会替换为子类的实现版本的入口地址。
深入理解java虚拟机-第八章的更多相关文章
- 读书笔记-《深入理解Java虚拟机:JVM高级特性与最佳实践》
		
目录 概述 第一章: 走进Java 第二章: Java内存区域与内存溢出异常 第三章: 垃圾收集器与内存分配策略 第四章: 虚拟机性能监控与故障处理 第五章: 调优案例分析与实战 第六章: 类文件结构 ...
 - 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具
		
上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...
 - 《深入理解 java虚拟机》学习笔记
		
java内存区域详解 以下内容参考自<深入理解 java虚拟机 JVM高级特性与最佳实践>,其中图片大多取自网络与本书,以供学习和参考.
 - (1) 深入理解Java虚拟机到底是什么?
		
好文转载:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机 作为一个Java程序员,我们每天都在写Java ...
 - 深入理解java虚拟机(7)---线程安全 & 锁优化
		
关于线程安全的话题,足可以使用一本书来讲解这些东西.<Java Concurrency in Practice> 就是讲解这些的,在这里 主要还是分析JVM中关于线程安全这块的内容. 1. ...
 - 深入理解java虚拟机(6)---内存模型与线程 & Volatile
		
其实关于线程的使用,之前已经写过博客讲解过这部分的内容: http://www.cnblogs.com/deman/category/621531.html JVM里面关于多线程的部分,主要是多线程是 ...
 - 深入理解java虚拟机(5)---字节码执行引擎
		
字节码是什么东西? 以下是百度的解释: 字节码(Byte-code)是一种包含执行程序.由一序列 op 代码/数据对组成的二进制文件.字节码是一种中间码,它比机器码更抽象. 它经常被看作是包含一个执行 ...
 - 深入理解java虚拟机(4)---类加载机制
		
类加载的过程包括: 加载class到内存,数据校验,转换和解析,初始化,使用using和卸载unloading过程. 除了解析阶段,其他过程的顺序是固定的.解析可以放在初始化之后,目的就是为了支持动态 ...
 - 深入理解java虚拟机(1)------内存区域与内存溢出
		
在C++领域,关于C++的内存存储,结构等等,有一本书:深度探索C++对象模型,讲解的非常透彻. 而Java确把这一工作交给了虚拟机来处理. 我们首先来看看关于内存的问题. 1.问题: 1)java ...
 
随机推荐
- Set,List,Map的区别
			
最近在学习struct2中OGNL表达式的过程中,发现自己对set,list,map存在只是欠缺,在百度的过程中发现了此文觉得讲的不错,放到自己博客以便再次查阅,也希望更多地菜鸟看到. java集合的 ...
 - mapreduce 运行-指定各种运行参数
			
mapreduce指定参数 mapreduce在运行的时候可以指定各种参数,这样可以根据实际的应用场景做一下相关的调整 1.指定运行时cpu的个数 hadoop jar hadoop-core-0.1 ...
 - AngularJS post传值后台获取不到
			
AngularJS post传值后台获取不到 一般的思路: 解决办法: 1.设置一下default head 2.参数转换一下data:$.param({orderNo: orderNo,sessi ...
 - Leaflet API 翻译(二)
			
摘自:http://www.ithao123.cn/content-824673.html L.Point 显示以像素为单位的点的x,y坐标. 所以接受点对象的leaflet方法和选项都也接受他们简单 ...
 - 剑指offer编程题66道题 26-35
			
26.二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 中序遍历思路:按照右中左的顺序,中序遍历对 ...
 - with as  (cte  common  table expression)   公共表表达式
			
SQL中 with as 的用法——使用公用表表达式(CTE) 公用表表达式 (CTE) 可以认为是在单个 SELECT.INSERT.UPDATE.DELETE 或 CREATE VIEW 语句的 ...
 - try-catch-finally的问题
			
参考: https://blog.csdn.net/chengzhezhijian/article/details/17264531 面试一家公司的面试题,注: 那个面试官对这个问题挺看重的(可是我回 ...
 - 【Java】仿真qq尝试:用户注册(三)
			
需求: 实现用户名和密码存入数据库. 思路: 1.连接数据表用静态加载块 2.crud写成4个静态方法 具体流程: from:https://www.tutorialspoint.com/jdbc/j ...
 - EasyUI:datagrid数据汇总
			
EasyUI:datagrid数据汇总 js代码: var total=0;//全局变量 $(function(){ $('#tablebudgetdata').datagrid({ title:' ...
 - java中获取服务器的IP和端口
			
struts2 获取request HttpServletRequest requet=ServletActionContext.getRequest(); requet.getScheme()+&q ...