JVM 运行时数据区域
程序计数器
字节码解释器通过改变程序计数器的值来依次读取指令,从而实现代码的流程控制,分支、循环、跳转、异常处理等基础功能都依赖这个计数器完成。
在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能恢复到正确的执行位置(能够知道该线程上次运行到哪儿了)【这也是为什么程序计数器需要每个线程独立拥有一个】。
注:程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。
Java 虚拟机栈
什么是虚拟机栈:描述 Java 方法执行的内存模型。Java 虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息。每个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
<扩展>
关于异常:
Java 虚拟机栈会出现两种错误:StackOverFlowError 和 OutOfMemoryError。
StackOverFlowError: 若 Java 虚拟机栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前 Java 虚拟机栈允许的最大深度的时候,就抛出 StackOverFlowError 错误。
OutOfMemoryError: 若 Java 虚拟机堆中没有空闲内存,并且垃圾回收器也无法提供更多内存的话。就会抛出 OutOfMemoryError 错误。
方法 / 函数如何被调用?
Java 栈可用类比数据结构中栈,Java 栈中保存的主要内容是栈帧,每一次函数调用都会有一个对应的栈帧被压入 Java 栈,每一个函数调用结束后,都会有一个栈帧被弹出。
Java 方法有两种返回方式:
1. return 语句。
2. 抛出异常。
不管哪种返回方式都会导致栈帧被弹出。
本地方法栈
本地方法栈和虚拟机栈的关系?
和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法(本地方法)服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。
可能出现的异常?
同 Java 虚拟机栈
堆
所属:Java 堆是被所有线程共享的一块内存区域
目的 / 作用:存放对象实例,“几乎”所有的对象实例和数组都在这里分配内存。
版权声明: 本文为 InfoQ 作者【W🌥】的原创文章。
原文链接:【http://xie.infoq.cn/article/8a7c6b7f21f0f2f444e3db5d7】。文章转载请联系作者。
评论