ClassFile & JVM Memory Model
ClassFile |
基本组成 常量池计数器constant_pool_count 常量池数据区constant_pool[constant_pool_count-1] 访问标志 access_flags 方法计数器 methods_count 方法信息数据区methods[methods_count] 方法表method[] Ⅰ.Constant Pool cp_info # 字面量 Literal [1] 文本字符串 [2] final常量值 [3] 基本类型的值 [4] 其他 # 符号引用 Symbolic Reference [1]Class和结构的完全限定名 [2] Filed 的名称和描述符 [3] Method 的名称和描述符 Ⅱ.VN Stack 虚拟机栈 [1] Current Frame-Current Method-Current Class[当前活动栈—当前方法—当前类] [2] 功能:表示方法调用 LIFO [Last In First Out] [3] 生命周期:线程相同 Ⅲ. Stack Frame 栈帧 ##1 存储数据、储存部分过程结果 ##2 处理动态链接、方法返回值、异常分派 [Dynamic Linking,Dispatch Exception] [1] Local Variable Table局表变量表 # 编译期确认局部变量的数量,存储到Method的CODE属性 [2] Operand Stack 操作数栈 # JVM底层字节码指令集,基于栈, 深度属性存储在Method的CODE属性 [3] Dynamic Linking 动态链接 # 指向运行时常量池的引用 [4] Return Address 方法出口 # 正常返回,恢复调用者状态 [ 局部变量、操作数栈、PCR] # 抛出异常,或者捕获,返回值,不会返回给调用者 [..] 其他信息 Ⅳ. Method Area 方法区 [类级变量、实例变量] [1] 运行时常量区 # 类型用到常量的有序集合 # 通过索引访问,动态连接 #1 直接常量 #2 符号引用:其他Type、Field、Method [2] 类型信息 #1 完全限定名 #2 直接超类的完全限定名 #3 直接超接口的全限定名列表 #4 属性: 类类型\接口类型 #5 访问修饰符 [3] 字段信息 #1 字段名称 #2 字段类型:基本类型\引用类型 #3 字段修饰符(访问修饰符+static+transient等) [4] 方法信息 #1 方法名称 #2 返回类型 #3 传入参数:个数、类型、顺序 #4 修饰符 #5 字节码bytecodes(VM Metod) #6 操作数栈、方法在栈帧中的局部变量区的大小 #7 异常表 [5] 类变量 #1非编译时变量 (分配内存,设置默认值) # 2 编译时变量 ( 编译时常量,复制到常量池) 【static修饰的变量】 [6] 指向类加载器的引用 # 自定义类加载器的对象,加载过程,对象的引用 [7] 指向Class实例的引用 # Class对象,加载过程,对象的引用 [8] 方法表 #定义: 一组对类实例方法的直接引用。#功能: 通过方法表-快速激活实例方法 |
JVM Memory Model |
一、运行时数据区 线程 储存 [1] Program Counter Register 私有 当前执行指令、下条字节码指令的地址 [ VM指令:PC=地址 ,Native指令: PC=null] [2] Method Area 共享 类信息、常量、静态变量、及时编译出的代码 [3] Heap 共享 对象实例,JVM启动时创建,GC管理 [4] VM Stack 私有 局部变量表、操作栈、动态链接、方法出口 调用VM Method, 创建Stack Frame栈帧 [5] Native Method Stack 私有 本地方法的局部变量表、操作栈 调用Native Method |