【深入java虚拟机(1)】:java内存区域与内存溢出-编程开发技术

【深入java虚拟机(1)】:java内存区域与内存溢出-编程开发技术

ID:30776435

大小:335.50 KB

页数:8页

时间:2019-01-03

【深入java虚拟机(1)】:java内存区域与内存溢出-编程开发技术_第1页
【深入java虚拟机(1)】:java内存区域与内存溢出-编程开发技术_第2页
【深入java虚拟机(1)】:java内存区域与内存溢出-编程开发技术_第3页
【深入java虚拟机(1)】:java内存区域与内存溢出-编程开发技术_第4页
【深入java虚拟机(1)】:java内存区域与内存溢出-编程开发技术_第5页
资源描述:

《【深入java虚拟机(1)】:java内存区域与内存溢出-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、【深入Java虚拟机(1)】:Java内存区域与内存溢出・编程开发技术【深入Java虚拟机(1)】:Java内存区域与内存溢出原文岀处:兰亭风雨内存区域Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。下而详细阐述齐数据区所存储的数据类型。程序计数器(Program?Counter?Register)一块较小的内存空间,它是当前线程所执行的字节码的行号指示

2、器,字节码解释器工作时通过改变该计数器的值来选择下一条需要执行的字节码指令,分支、跳转、循环等基础功能都要依赖它来实现。每条线程都有一个独立的的程序计数器,各线程间的计数器互不影响,因此该区域是线程私有的。当线程在执行一个Java方法时,该计数器记录的是止在执行的虚拟机字节码指令的地址,当线程在执行的是Native方法(调用本地操作系统方法)时,该计数器的值为空。另外,该内存区域是唯一一个在Java虚拟机规范中么有规定任何00M(内存溢出:OutOfMemoryError)情况的区域。Java虚拟机栈(Java?V

3、irtual?Machine?Stacks)该区域也是线程私有的,它的生命周期也与线程相同。虚拟机栈描述的是J3V3方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧,栈它是用于支持续虚拟机进行方法调用和方法执行的数据结构。对于执行引擎来讲,活动线程屮,只有栈顶的栈帧是有效的,称为当前栈帧,这个栈帧所关联的方法称为当前方法,执行引擎所运行的所有字节码指令都只针对当前栈帧进行操作。栈帧用于存储局部变量表、操作数栈、动态链接、方法返回地址和一些额外的附加信息。在编译程序代码时,栈帧屮需要多大的局部变量表、多深

4、的操作数栈都已经完全确定了,并口写入了方法表的Code属性之中。因此,一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。在Java虚拟机规范中,对这个区域规定了两种异常情况:1、如杲线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。2、如果虚拟机在动态扩展栈时无法中请到足够的内存空间,则抛出OutOfMemoryError异常。这两种情况存在着一些互相重叠的地方:当栈空间无法继续分配时,到底是内存太小,述是已使用的栈空间太大,其本质上只是

5、对同一件事情的两种描述而已。在单线程的操作屮,无论是由于栈帧太大,还是虚拟机栈空间太小,当栈空间无法分配时,虚拟机抛出的都是StackOverflowError异常,而不会得到OutOrMemoryError异彳f。而在多线程环境下,则会抛出OutOfMemoryError异常。下面详细说明栈帧中所存放的各部分信息的作用和数据结构。1、局部变量表局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量,其中存放的数据的类型是编译期可知的各种基木数据类型、对象引用(reference)和returnA

6、ddress类型(它指向了—条字节码指令的地址)。局部变量表所需的内存空间在编译期间完成分配,即在Java程序被编译成Class文件时,就确定了所需分配的最大局部变量表的容量。当进入一个方法时,这个方法需要在栈屮分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。局部变量表的容量以变量槽(Slot)为最小单位。在虚拟机规范屮并没有明确指明一个Slot应占用的内存空间大小(允许其随着处理器、操作系统或虚拟机的不同而发生变化),一个Slot可以存放一个32位以内的数据类型:boolean,byt

7、e、char>short>int、float、referenee和returnAddresss。referenee是对彖的引用类型,returnAddress是为字节指令服务的,它执行了一条字节码指令的地址。对于64位的数据类型(long和double),虚拟机会以高位在前的方式为其分配两个连续的Slot空间。虚拟机通过索引定位的方式使用局部变量表,索引值的范围是从0开始到局部变量表最大的Slot数量,对于32位数据类型的变量,索引n代表第n个Slot,对于64位的,索引n代表第n和第n+1两个Slot。在方法执行

8、时,虚拟机是使用同部变量表来完成参数值到参数变量列表的传递过程的,如果是实例方法(非static),则局部变量表中的第0位索引的Slot默认是用于传递方法所屈对彖实例的引用,在方法屮可以通过关键字“this”来访问这个隐含的参数。其余参数则按照参数表的顺序来排列,占用从1开始的局部变量Slot,参数表分配完毕后,再根据方法体内部定义的变量顺序和作用域分配其余

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。