jvm内存管理:深入java内存区域与oom

jvm内存管理:深入java内存区域与oom

ID:32585456

大小:73.68 KB

页数:8页

时间:2019-02-13

jvm内存管理:深入java内存区域与oom_第1页
jvm内存管理:深入java内存区域与oom_第2页
jvm内存管理:深入java内存区域与oom_第3页
jvm内存管理:深入java内存区域与oom_第4页
jvm内存管理:深入java内存区域与oom_第5页
资源描述:

《jvm内存管理:深入java内存区域与oom》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java与C++Z间有一堵由内存动态分配和垃圾收集技术所国成的高墙,墙外面的人想进去,墙里面的人却想出來。对于从事C、C++稈序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝乂是执行最基础工作的劳动人民一拥有每一个对象的14所有权J乂担负着每一个对象生命开始到终结的维护责任。对于Java程序员来说,不需耍在为每一个new操作去写配对的delete/free,不容易出现内容満漏和内存溢出错误,看起来由JVM管理内存一切都很美好。不过,也正定因为Java程序员把内存控制的权力交给了JVM,一旦出现泄

2、漏和溢出,如果不了解JVM是怎样使用内存的,那排查错误将会是一件非常困难的爭情。VM运行时数据区域JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途、创建和销毁时间。根据《Java虚拟机规范(第二版)》(下文称VMSpec)的规定,JVM包括下列儿个运行时数据区域:1.程序计数器(ProgramCounterRegister):每一个Java线程都有一个程序计数器來用于保存程序执行到当询方法的哪一个指令,对于非Native方法,这个区域记录的是正在执行的VM原语的地址,如果止在执行的是N

3、atvie方法,这个区域则为空(undefined)。此内存区域是唯个在VMSpec中没有规定任何OutOfMemoryError情况的区域。2.Java虎拟机栈(JavaVirtualMachineStacks)与程序计数器一样,VM栈的生命周期也是与线程相同。VM栈描述的是Java方法调用的内存模型:每个方法被执行的时候,都会同时创建一个帧(Frame)用于存储木地变量表、操作栈、动态链接、方法出入口等信息。每一个方法的调用至完成,就意味着一个帧在VM栈中的入栈至出栈的过程。在后文中,我们将着垂讨论VM栈中

4、本地变量表部分。经常有人把Java内存简单的区分为堆内存(Heap)和栈内存(Stack),实际中的区域远比这种观点复杂,这样划分只是说明少变量定义密切相关的内存区域是这两块。其中所指的“堆”后面会专门描述,而所指的“栈”就是VM栈中各个帧的木地变臺表部分。木地变臺表存放了编译期可知的各种标臺类型(boolean,byte、char、short,int、float、long>double)>对象引用(不是对象木身,仅仅是一个引用指针)、方法返冋地址等。其中long和double会占用2个本地变量空间(32bit

5、),其余占川1个。本地变量表在进入方法时进行分配,当进入一个方法时,这个方法需要在帧中分配多大的本地变量是一件完全确定的事情,在方法运行期间不改变本地变量表的大小。在VMSpec中对这个区域规定了2中异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果VM栈町以动态扩展(VMSpec中允许固定长度的VM栈),当扩展时无法屮请到足够内存则抛出OutOfMemoryError并常。3.本地方法栈(NativeMethodStacks)本地方法栈与VM栈所发挥作用

6、是类似的,只不过VM栈为虚拟机运行VM原语服务,而本地方法栈是为虚拟机使用到的Native方法服务。它的实现的语言、方式与结构并没冇强制规泄,甚至有的虚拟机(譬如SunHotspot虚拟机)直接就把木地方法栈和VM栈合二为一。和VM栈一样,这个区域也会抛出StackOverflowError和OutOfMemoryError异常。1.Java堆(JavaHeap)对于绝大多数应用來说,Java堆是虚拟机管理最大的一块内存。Java堆是被所有线程共享的,在虚拟机启动时创建。Java堆的唯一目的就是存放对象实例,绝

7、大部分的对象实例都在这里分配。这一点在VMSpec中的描述是:所有的实例以及数组都在堆上分配(原文:Theheapistheruntimedataareafromwhichmemoryforallclassinstancesandarraysisallocated),但是任逃逸分析和标量替换优化技术Hl现后,VMSpec的描述就显得并不那么准确了。Java堆内还有更细致的划分:新生代、老年代,再细致一点的:eden、fromsurvivor,tosurvivor,甚至更细粒度的木地线程分配缓冲(TLAB)等,无

8、论对Java堆如何划分,目的都是为了更好的回收内存,或者更快的分配内存,在本章中我们仅仅针对内存区域的作川进行讨论,Java堆中的上述各个区域的细节,可参见本文第二章《JVM内存管理:深入垃圾收集器与内存分配策略》。根据VMSpec的要求,Java堆可以处于物理上不连续的内存空间,它逻辑上是连续的叩可,就像我们的磁盘空间一样。实现时可以选择实现成固定人小的,也可以是可扩展的,不过当前所

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

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

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