深入解析Java的运行时数据区
17页1、深入解析Java的运行时数据区 【摘要】 Java程序运行的过程中,JVM会将其所管理的内存划分成若干个区域,统称为是运行时数据区。其中,一些线程间共享的区域,随着JVM的启动而创建,JVM的退出而销毁;另一些线程私有的区域,则随着线程的开始而创建,线程的结束而销毁。如图所示,运行时数据区由以下几个区域所组成:程序计数器、Java虚拟机栈、本地方法栈、方法区、堆。Java程序运行的过程中,JVM会将其所管理的内存划分成若干个区域,统称为是运行时数据区。其中,一些线程间共享的区域,随着JVM的启动而创建,JVM的退出而销毁;另一些线程私有的区域,则随着线程的开始而创建,线程的结束而销毁。如图所示,运行时数据区由以下几个区域所组成:程序计数器、Java虚拟机栈、本地方法栈、方法区、堆。运行时数据区根据JVM的运行模型,程序运行前,JVM会将程序编译后的字节码加载到内存中;程序运行时,字节码解析器会读取内存中的字节码,按照顺序将字节码的指令解析成固定的操作。在这过程中,程序计数器(Program Counter Register)保存当前线程正在执行的字节码地址。从字节码运行的原理来看,单线
2、程模型下的程序计数器貌似可有可无,字节码解析器会按照顺序将字节码翻译成固定操作,即使遇到分支跳转,也无碍程序正确运行下去。然而,现实中的程序往往是通过多线程协作来完成一个任务的,CPU会为每个线程分配一定的时间片,一个线程在其时间片耗尽之后会挂起,直到它再次获得时间片后才会重新运行。为了确保程序正确运行,线程必须从挂起的地方重新执行。有了程序计数器,就可以保证在涉及线程上下文切换的情景下,程序依然能够正确无误地运行下去。因此,程序计数器是线程私有的,避免了线程之间的相互影响。JVM会为每个线程都分配一块非常小的内存空间用作程序计数器,这也是唯一一个Java虚拟机规范没有规定OutOfMemoryError的运行时区域。JVM会给每个线程都分配一个私有的内存空间,称为Java虚拟机栈(Java VM Stack)。Java虚拟机栈随着线程的创建而创建,它与传统语言(如C语言)的栈有着类似的作用,JVM只会对其执行两种操作:栈帧(Stack Frame)的入栈和出栈。也就是说,Java虚拟机栈是存储栈帧的后进先出队列(LIFO)。每个方法的执行过程,都会伴随着栈帧的创建、入栈和出栈。栈帧是
3、用来存储局部数据和部分过程结果的数据结构,主要包含局部变量表(Local Variable Table)、操作数栈(Operand Stack)、指向当前方法所属类的运行时常量池的引用(Runtime Constant Pool Reference),如图所示为Java虚拟机栈的模型。Java 虚拟栈模型局部变量表(LVT)局部变量表(LVT) 是一个索引以0开始的字节数组,存储了一个方法的所有入参和局部变量。LVT所存储的类型都是编译期可知的,包括各基础类型(byte、char、short、int、long、float、double、boolean)、对象引用(reference类型)和returnAddress类型(指向一条字节码指令的地址)。LVT有如下几个特点:1、第0个Slot(槽位)固定存储指向方法所属对象的this指针。2、除了long和double占用了连续2个Slot之外,其他类型都只占用了1个Slot。3、LVT按照变量的声明顺序进行存储。考虑以下代码来验证LVT的这些特点:先用javac命令将其编译成class文件:javac-gJvmStackLvt.java#
4、javac编译.java文件,输出.class文件再使用javap命令解析class文件,就可以看到showLvt函数的LVT。从javap的输出结果可以看出,LVT的第0个Slot的名字为this,签名为Lcom/yrunz/jdk/chapter1/JvmStackLvt表示是指向JvmStackLvt类型的this指针,验证了特点1;变量l和d所在Slot的索引与其相邻的变量所在Slot 的索引相差2,表示l和d占用了2个Slot,而其他的变量都只占用了1个Slot,验证了特点2;LVT中变量的存储顺序也是与其声明顺序相同,验证了特点3。操作数栈(OS)操作数栈(OS) 用于在方法运算过程存储其中间的运算结果、方法入参和返回结果,它是一个后进先出(Last-In-First-Out,LIFO)的队列。JVM提供了对OS出栈和入栈的指令,如load指令属于入栈指令、store指令属于出栈指令。考虑以下代码:使用javac命令将其编译成class文件后,用javap解析得到:因为javap的输出结果中并不涉及操作数栈的内容,我们可以根据指令码和LVT来推断出OS的入栈和出栈过程,如图
《深入解析Java的运行时数据区》由会员Baige****0346分享,可在线阅读,更多相关《深入解析Java的运行时数据区》请在金锄头文库上搜索。
员工积极主动行为的组态效应:基于过程的视角
汪晖齐物平等与跨体系社会的天下想象
函数性质中的数学抽象在问题解决与设计中的应用
日本东京大学入学考试理科数学试题解析
二次电池研究进展
实践研究与论理逻辑
光学视觉传感器技术研究进展
龙泉青瓷的传承困境与发展
齐齐哈尔地区抗根肿病大白菜品种的抗性鉴定与评价
基于系统动力学模型的胶州湾海域承载力预测
基于弯液面电化学连接碳纤维实验初探
龟甲胶研究发展探析
鼻腔黏膜免疫佐剂鞭毛蛋白的研究进展
鼻内镜辅助上颌骨部分切除术治疗鼻腔鼻窦腺样囊性癌的临床分析
黑豆不同发芽期多酚、黄酮及抗氧化活性分析
齐鲁青未了:山东当代文学审美流变论
黄登水电站机电设备安装工程施工技术质量管理
黄河文化传承视角下音乐剧创作探究
黄亦琦从风论治咳嗽变异性哮喘经验※
鲸豚动物吸附式声学行为记录器综述
2022-03-24 12页
2022-03-24 11页
2022-03-24 10页
2022-03-24 25页
2022-03-24 13页
2022-03-24 18页
2022-03-24 10页
2022-03-24 32页
2022-03-24 8页
2022-03-24 9页