Java学习之虚拟机运行时

上传人:平*** 文档编号:24931476 上传时间:2017-12-08 格式:PPT 页数:27 大小:8.06MB
返回 下载 相关 举报
Java学习之虚拟机运行时_第1页
第1页 / 共27页
Java学习之虚拟机运行时_第2页
第2页 / 共27页
Java学习之虚拟机运行时_第3页
第3页 / 共27页
Java学习之虚拟机运行时_第4页
第4页 / 共27页
Java学习之虚拟机运行时_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《Java学习之虚拟机运行时》由会员分享,可在线阅读,更多相关《Java学习之虚拟机运行时(27页珍藏版)》请在金锄头文库上搜索。

1、,Java学习之-虚拟机运行时,戎码一生http:/,2017/12/8,大纲,虚拟机内部体系结构运行时基本流程方法表堆程序计数器Java栈执行引擎,2017/12/8,虚拟机内部体系结构,方法区,堆,栈,本地方法栈,PC寄存器,类装在子系统,class文件,执行引擎,运行时数据区,2017/12/8,运行时的流程,开始,装载,验证,准备,解析,初始化,执行方法,结束,垃圾回收,2017/12/8,运行时的流程-装载,读取二进制流解析二进制流,并存入方法区类型信息、字段、方法、常量池、类变量等创建一个该类型的java.lang.Class对象,2017/12/8,运行时的流程-验证,语义验证,

2、比如:1. 检查final的类不能被继承2. 检查final的方法不能被重写3. 检查超类和子类的方法的兼容性(是否出现同名方法,但是不是重载的情况)4. 检查各常量池入口之间的一致性,2017/12/8,运行时的流程-准备,类变量的内存分配类变量的默认值设置,a为实例变量,初始化阶段该实例还未被创建。b为类变量,准备阶段分配内存,并设置默认值为0。,2017/12/8,运行时的流程-解析,把符号引用替换成直接引用,符号引用:和字节码中的信息基本类似。,直接引用:1. 指向类型、类变量和类方法的直接引用可能是指向方法区的本地指针。2. 指向实例变量和实例方法的直接引用都是偏移量。,2017/1

3、2/8,运行时的流程-初始化,初始化类变量的值,有啥问题?,2017/12/8,运行时的流程-初始化,初始化类变量的值先超类,后子类初始化阶段,通过调用方法对类变量初始化语句和静态语句块进行初始化类变量初始化语句和静态语句块的执行优先级是相同的,按照Java源代码中的顺序一次执行实例变量不在这个阶段进行初始化,而是在new操作的时候调用方法进行初始化类变量初始化语句:/public static int staticInt; 不是类变量初始化语句public static int staticInt = 5;public static double c = Math.random()*0.3;

4、静态语句块:static。,2017/12/8,类初始化:方法,2017/12/8,实例初始化:方法,2017/12/8,方法表-方法查找,2017/12/8,方法表-方法查找,虚拟机规范没有规定必须有方法表(方法表需要额外的内存)在字节码装载的时候存放到方法区中私有方法和实例初始化方法调用指令:invokespecial静态方法的调用指令:invokestatic每个类都有一个方法表,方法表包含从超类继承来的实例方法方法表中的方法是非私有、非静态、非初始化的实例方法方法表可以理解为一个指针数组,每个元素指向方法区中的某个方法实例方法调用指令:invokevirtual接口方法调用指令:inv

5、okeinterface每个堆中的实例都有一个指向方法区的指针,都说接口方法调用比实例方法慢,为什么,why?,2017/12/8,方法表-Dog的方法表,2017/12/8,方法表-CockerSpaniel的方法表,2017/12/8,方法表-Dog的方法表,2017/12/8,堆,堆用来存储创建的实例(对象、数组)有分配新对象的指令,但没有释放对象内存的指令,释放内存完全交由垃圾收集器来做一个Java程序一个Java虚拟机实例,一个Java虚拟机实例一个堆虚拟机或者Java程序之间的堆互不干扰,但同一个Java程序中的不同线程共享堆堆空间不一定是连续的内存区,可动态伸缩,2017/12/

6、8,堆-实现1,指向对象池的指针,指向类数据的指针,堆,句柄,对象,实例数据,对象锁、等待集合,垃圾收集相关数据,。,。,方法区,类数据,类数据,类数据,类数据,类数据,。,指向句柄池的指针,。,一个对象的引用,2017/12/8,堆-实现2,指向类数据的指针,实例数据,堆,方法区,类数据,类数据,类数据,类数据,类数据,。,指向堆的指针,。,一个对象的引用,对象锁、等待集合,垃圾收集相关数据,。,对象,2017/12/8,程序计数器,每个线程一个程序计数器总是指向下一条指令(在调用方法返回的时候是指向哪儿?)在方法内跳转的时候会用到程序计数器,比如:goto fff9(程序计数器的值-7等于

7、下一跳指令的位置)程序计数器还有啥作用?,2017/12/8,Java栈,往Java栈中压栈和出栈的目标是栈帧每调用一个方法就创建一个栈帧Java栈通常是预先分配一个较长的内存空间,当空间不够的时候再扩展Java栈栈帧(与方法对应)局部变量区(存放方法参数和方法体中的局部变量,生命周期短)操作数栈(栈帧中的栈,用于指令操作数存储,生命周期短)帧数据区(存放常量池指针、异常表的引用、调试数据、支持方法正常返回),2017/12/8,Java栈,Main类main()栈帧,Main类main()栈帧,ClassA类栈帧,Main类main()栈帧,ClassA类callClassBMethod()

8、栈帧,Main类main()栈帧,ClassA类callClassBMethod()栈帧,ClassB类call()栈帧,Main类main()栈帧,ClassA类callClassBMethod()栈帧,ClassB类call()栈帧,PrintStream类println()栈帧,Main类main()栈帧,Main类main()栈帧,ClassA类callClassBMethod()栈帧,ClassB类call()栈帧,。,栈底,栈顶,完成,出栈,println()完成,出栈,call()完成,出栈,callClassBMethod()和main()依次出栈,2017/12/8,Java栈-栈帧,a,指向常量池的指针,局部变量区,帧数据区,异常表的引用,调试数据,支持方法返回,等等,b,c,d,g,h,e,f,this,操作数栈,0,1,2,3,4,5,7,9,10,2017/12/8,Java栈-栈帧,this引用,帧数据区,1,result,88.88,帧数据区,addAndPrint()的栈帧,addTwoTypes()的栈帧,0,1,0,1,Java栈中紧凑的布局,2017/12/8,Reference,深入Java虚拟机Java虚拟机规范百度,2017/12/8,谢谢,内容纯属虚构,具体请看源码希望后续能有更实用的虚拟机解读,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号