深入理解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 ...
随机推荐
- netty5----心跳
netty3心跳: package com.heart; import java.net.InetSocketAddress; import java.util.concurrent.Executor ...
- 系统OOM复位定位
定位OOM的工具: 1.多次收集Thread Dump信息kill -3 PID通过对比分析heap 对象信息和Thread信息来定位 2.通过 -Xloggc:D:/gc.log -XX:+He ...
- html 5中的新特性之强化表单元素及属性
之前我们判断用户提交的是否是Email 的时候,往往使用js 进行判断,但在html5中可以有新的方式进行判断而且更简单 <!DOCTYPE html> <html lang=&qu ...
- EF Code-First 学习之旅 从已存在的数据库进行Code First
namespace EFDemo { using System; using System.Data.Entity; using System.ComponentModel.DataAnnotatio ...
- NUnit单元测试笔记
vs2010 和 NUnit 问题处理. . 在 <configuration> 下 加 ... <startup> <requiredRuntime version=& ...
- QTableWidget 列排序
connect(uirecord.tableWidget->horizontalHeader(),SIGNAL(sectionClicked(int)),this,SLOT(record_sor ...
- JavaScript tips —— 谈谈数组乱序
前言 先看一个段代码 function randArr (arr) { return arr.sort(() => { return (Math.random() - 0.5); }); } 目 ...
- js 技巧总结
插件解析 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录思想和分享知识提供更专业的工具. 您可以使 ...
- Mybatis报错Cause: org.apache.ibatis.executor.ExecutorException: Executor was closed.
SqlSession被关闭了,检查是否使用了被关闭的SqlSession.
- angular一些常用的方法:
angular.copy(); 用法:对Object对象的深度拷贝$scope.data = {name:'yanjinyun',age:'11'}; $scope.origData = angula ...