Java学习之虚拟机运行时.ppt_第1页
Java学习之虚拟机运行时.ppt_第2页
Java学习之虚拟机运行时.ppt_第3页
Java学习之虚拟机运行时.ppt_第4页
Java学习之虚拟机运行时.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

,Java学习之-虚拟机运行时,戎码一生,2019/11/19,大纲,虚拟机内部体系结构运行时基本流程方法表堆程序计数器Java栈执行引擎,2019/11/19,虚拟机内部体系结构,方法区,堆,栈,本地方法栈,PC寄存器,类装在子系统,class文件,执行引擎,运行时数据区,2019/11/19,运行时的流程,开始,装载,验证,准备,解析,初始化,执行方法,结束,垃圾回收,2019/11/19,运行时的流程-装载,读取二进制流解析二进制流,并存入方法区类型信息、字段、方法、常量池、类变量等创建一个该类型的java.lang.Class对象,2019/11/19,运行时的流程-验证,语义验证,比如:1.检查final的类不能被继承2.检查final的方法不能被重写3.检查超类和子类的方法的兼容性(是否出现同名方法,但是不是重载的情况)4.检查各常量池入口之间的一致性,2019/11/19,运行时的流程-准备,类变量的内存分配类变量的默认值设置,a为实例变量,初始化阶段该实例还未被创建。b为类变量,准备阶段分配内存,并设置默认值为0。,2019/11/19,运行时的流程-解析,把符号引用替换成直接引用,符号引用:和字节码中的信息基本类似。,直接引用:1.指向类型、类变量和类方法的直接引用可能是指向方法区的本地指针。2.指向实例变量和实例方法的直接引用都是偏移量。,2019/11/19,运行时的流程-初始化,初始化类变量的值,有啥问题?,2019/11/19,运行时的流程-初始化,初始化类变量的值先超类,后子类初始化阶段,通过调用方法对类变量初始化语句和静态语句块进行初始化类变量初始化语句和静态语句块的执行优先级是相同的,按照Java源代码中的顺序一次执行实例变量不在这个阶段进行初始化,而是在new操作的时候调用方法进行初始化类变量初始化语句:/publicstaticintstaticInt;不是类变量初始化语句publicstaticintstaticInt=5;publicstaticdoublec=Math.random()*0.3;静态语句块:static。,2019/11/19,类初始化:方法,2019/11/19,实例初始化:方法,2019/11/19,方法表-方法查找,2019/11/19,方法表-方法查找,虚拟机规范没有规定必须有方法表(方法表需要额外的内存)在字节码装载的时候存放到方法区中私有方法和实例初始化方法调用指令:invokespecial静态方法的调用指令:invokestatic每个类都有一个方法表,方法表包含从超类继承来的实例方法方法表中的方法是非私有、非静态、非初始化的实例方法方法表可以理解为一个指针数组,每个元素指向方法区中的某个方法实例方法调用指令:invokevirtual接口方法调用指令:invokeinterface每个堆中的实例都有一个指向方法区的指针,都说接口方法调用比实例方法慢,为什么,why?,2019/11/19,方法表-Dog的方法表,2019/11/19,方法表-CockerSpaniel的方法表,2019/11/19,方法表-Dog的方法表,2019/11/19,堆,堆用来存储创建的实例(对象、数组)有分配新对象的指令,但没有释放对象内存的指令,释放内存完全交由垃圾收集器来做一个Java程序一个Java虚拟机实例,一个Java虚拟机实例一个堆虚拟机或者Java程序之间的堆互不干扰,但同一个Java程序中的不同线程共享堆堆空间不一定是连续的内存区,可动态伸缩,2019/11/19,堆-实现1,指向对象池的指针,指向类数据的指针,堆,句柄,对象,实例数据,对象锁、等待集合,垃圾收集相关数据,。,。,方法区,类数据,类数据,类数据,类数据,类数据,。,指向句柄池的指针,。,一个对象的引用,2019/11/19,堆-实现2,指向类数据的指针,实例数据,堆,方法区,类数据,类数据,类数据,类数据,类数据,。,指向堆的指针,。,一个对象的引用,对象锁、等待集合,垃圾收集相关数据,。,对象,2019/11/19,程序计数器,每个线程一个程序计数器总是指向下一条指令(在调用方法返回的时候是指向哪儿?)在方法内跳转的时候会用到程序计数器,比如:gotofff9(程序计数器的值-7等于下一跳指令的位置)程序计数器还有啥作用?,2019/11/19,Java栈,往Java栈中压栈和出栈的目标是栈帧每调用一个方法就创建一个栈帧Java栈通常是预先分配一个较长的内存空间,当空间不够的时候再扩展Java栈栈帧(与方法对应)局部变量区(存放方法参数和方法体中的局部变量,生命周期短)操作数栈(栈帧中的栈,用于指令操作数存储,生命周期短)帧数据区(存放常量池指针、异常表的引用、调试数据、支持方法正常返回),2019/11/19,Java栈,Main类main()栈帧,Main类main()栈帧,ClassA类栈帧,Main类main()栈帧,ClassA类callClassBMethod()栈帧,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()依次出栈,2019/11/19,Java栈-栈帧,a,指向常量池的指针,局部变量区,帧数据区,异常表的引用,调试数据,支持方法返回,等等,b,c,d,g,h,e,f,this,操作数栈,0,1,2,3,4,5,7,9,10,2019/11/19,Java栈-栈帧,this引用,帧数据区,1,result,88.88,帧数据区,addAnd

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论