




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,Java学习之- 虚拟机运行时,戎码一生,2019/9/20,大纲,虚拟机内部体系结构 运行时基本流程 方法表 堆 程序计数器 Java栈 执行引擎,2019/9/20,虚拟机内部体系结构,方法区,堆,栈,本地方法栈,PC寄存器,类装在子系统,class文件,执行引擎,运行时数据区,2019/9/20,运行时的流程,开始,装载,验证,准备,解析,初始化,执行方法,结束,垃圾回收,2019/9/20,运行时的流程-装载,读取二进制流 解析二进制流,并存入方法区 类型信息、字段、方法、常量池、类变量等 创建一个该类型的java.lang.Class对象,2019/9/20,运行时的流程-验证,语义验证,比如: 1. 检查final的类不能被继承 2. 检查final的方法不能被重写 3. 检查超类和子类的方法的兼容性(是否出现同名方法,但是不是重载的情况) 4. 检查各常量池入口之间的一致性,2019/9/20,运行时的流程-准备,类变量的内存分配 类变量的默认值设置,a为实例变量,初始化阶段该实例还未被创建。 b为类变量,准备阶段分配 内存,并设置默认值为0。,2019/9/20,运行时的流程-解析,把符号引用替换成直接引用,符号引用: 和字节码中的信息基本类似。,直接引用: 1. 指向类型、类变量和类方法的直接引用可能是指向方法区的本地指针。 2. 指向实例变量和实例方法的直接引用都是偏移量。,2019/9/20,运行时的流程-初始化,初始化类变量的值,有啥问题?,2019/9/20,运行时的流程-初始化,初始化类变量的值 先超类,后子类 初始化阶段,通过调用方法对类变量初始化语句和静态语句块进行初始化 类变量初始化语句和静态语句块的执行优先级是相同的,按照Java源代码中的顺序一次执行 实例变量不在这个阶段进行初始化,而是在new操作的时候调用方法进行初始化 类变量初始化语句: /public static int staticInt; 不是类变量初始化语句 public static int staticInt = 5; public static double c = Math.random()*0.3; 静态语句块: static 。 ,2019/9/20,类初始化:方法,2019/9/20,实例初始化:方法,2019/9/20,方法表-方法查找,2019/9/20,方法表-方法查找,虚拟机规范没有规定必须有方法表(方法表需要额外的内存) 在字节码装载的时候存放到方法区中 私有方法和实例初始化方法调用指令:invokespecial 静态方法的调用指令:invokestatic 每个类都有一个方法表,方法表包含从超类继承来的实例方法 方法表中的方法是非私有、非静态、非初始化的实例方法 方法表可以理解为一个指针数组,每个元素指向方法区中的某个方法 实例方法调用指令:invokevirtual 接口方法调用指令:invokeinterface 每个堆中的实例都有一个指向方法区的指针,都说接口方法调用 比实例方法慢, 为什么,why?,2019/9/20,方法表-Dog的方法表,2019/9/20,方法表-CockerSpaniel的方法表,2019/9/20,方法表-Dog的方法表,2019/9/20,堆,堆用来存储创建的实例(对象、数组) 有分配新对象的指令,但没有释放对象内存的指令,释放内存完全交由垃圾收集器来做 一个Java程序一个Java虚拟机实例,一个Java虚拟机实例一个堆 虚拟机或者Java程序之间的堆互不干扰,但同一个Java程序中的不同线程共享堆 堆空间不一定是连续的内存区,可动态伸缩,2019/9/20,堆-实现1,指向对象池的指针,指向类数据的指针,堆,句柄,对象,实例数据,对象锁、等待集合,垃圾收集相关数据,。,。,方法区,类数据,类数据,类数据,类数据,类数据,。,指向句柄池的指针,。,一个对象的引用,2019/9/20,堆-实现2,指向类数据的指针,实例数据,堆,方法区,类数据,类数据,类数据,类数据,类数据,。,指向堆的指针,。,一个对象的引用,对象锁、等待集合,垃圾收集相关数据,。,对象,2019/9/20,程序计数器,每个线程一个程序计数器 总是指向下一条指令(在调用方法返回的时候是指向哪儿?) 在方法内跳转的时候会用到程序计数器,比如:goto fff9(程序计数器的值-7等于下一跳指令的位置) 程序计数器还有啥作用?,2019/9/20,Java栈,往Java栈中压栈和出栈的目标是栈帧 每调用一个方法就创建一个栈帧 Java栈通常是预先分配一个较长的内存空间,当空间不够的时候再扩展Java栈 栈帧(与方法对应) 局部变量区(存放方法参数和方法体中的局部变量,生命周期短) 操作数栈(栈帧中的栈,用于指令操作数存储,生命周期短) 帧数据区(存放常量池指针、异常表的引用、调试数据、支持方法正常返回),2019/9/20,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/9/20,Java栈-栈帧,a,指向常量池的指针,局部变量区,帧数据区,异常表的引用,调试数据,支持方法返回,等等,b,c,d,g,h,e,f,this,操作数栈,0,1,2,3,4,5,7,9,10,2019/9/20,Java栈-栈帧,this引用,帧数据区,1,result,88.88,帧数据区,add
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教练专业测试题及答案
- 2025年和田地区教师招聘考试笔试试题(含答案)
- mapjava面试题及答案
- 东北护士考试题及答案
- 2025年贵州毕节工业职业技术学院招聘考试笔试试题(含答案)
- 2025年广东省电工技师职业技能理论考试练习题库(含答案)
- 2024年山东临沂中考道德与法治试题及答案
- 资产评估师财务会计应收账款考试题(含答案)
- 数字化物流商业运营 习题答案-模块七
- 2024年医务人员查对制度考试题(含答案)
- 《患者安全目标解读》课件
- 甲状腺功能亢进症课件
- 锂离子电池正极材料研究进展
- 二手房屋买卖物品交接清单
- 技师论文 变频器的维修与保养
- 非标自动化设备项目进度表
- 诊断学教学胸部查体
- 桥梁安全事故案例警示
- SB/T 10460-2008商用电开水器
- GB/T 9124.1-2019钢制管法兰第1部分:PN系列
- GA 1800.2-2021电力系统治安反恐防范要求第2部分:火力发电企业
评论
0/150
提交评论