java内存区域——运行时数据区域

根据《java虚拟机规范》,Java运行时管理的内存区域包括以下几个运行时数据区域:

 

 

 

 

程序计数器:程序计数器是一块较小的内存,它可以看作是当前线程执行的字节码行号指示器。字节码解释器工作时就是通过计数器来选择需要执行的下一条字节码执行指令。由于Java虚拟机的的多线程是通过线程的轮流切换,分配处理器执行时间实现的。在任何一个时刻,一个处理器都只会执行一条线程,所以每个线程都需要拥有各自的程序计数器,相互之前互不影响,独立存储。这种内存区域称之为“线程私有”的。此区域是唯一一个在《java虚拟机规范》中没有OutOfMemoryError情况的区域。

虚拟机栈:Java虚拟机栈也是线程私有的。java虚拟机栈描述的是方法执行的线程内存模型:每个方法被执行时,Java虚拟机都会同步创建一个栈帧,用于存储方法的局部变量表、操作数栈、动态连接,方法出口等信息。每一个方法从调用直至执行完毕,都对应着这个栈帧在虚拟机栈的入栈与出栈。这个区域规定了两类异常情况:当线程请求的栈深度大于虚拟机允许的深度,会抛出StackOverflowError;如果栈容量可以动态扩展,当扩展时无法申请到足够的内存会抛出OutOfMemoryError异常。

本地方法栈:本地方法栈的作用与虚拟机栈的作用是相似的。区别是本地方法栈为虚拟机使用本地方法服务。它同虚拟机栈一样也会对应的出现StackOverflowError和OutofMemoryError异常。

方法区:此区域是线程所共享的区域。它用于存储已被虚拟机加载的常量,静态变量,类型信息,即时编译器编译后的代码缓存等数据。根据《java虚拟机规范》,当方法区无法满足新的内存分配需求时,会抛出OutOfMemoryError异常。

java堆:此区域是线程所共享的区域。对于java程序而言,这一区域是Java虚拟机所管理的最大的一块内存。此内存的唯一目的是存放对象实例。根据《Java虚拟机规范》,此区域可以是物理上不连续的内存空间中,但是在逻辑上被视为连续的。当堆无法扩展时,会抛出OutOfMemoryError异常。

 

参考:《深入理解Java虚拟机》第三版——周志明

 

posted @ 2022-05-18 17:28  知识怪人  阅读(96)  评论(0编辑  收藏  举报