读书笔记 -深入理解Java虚拟机----自动内存管理机制

 2019-12-22 10:50  阅读(796)
文章分类:JVM

Java虚拟机运行时数据区

2019120001351\_1.png

程序计数器:由于Java虚拟机的多线程是通过是通过轮流切换并分配处理器执行时间的方式实现的。程序计数器是线程私有的。

在任何一个确定的时刻,一个处理器(或者多处理器的一个内核)都只会执行一条线程中的指令,因此,为了在切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程计数器互不影响,独立存储,把这类内存称为“线程私有”的内存。

线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令地址;

线程执行的是native 方法,这个计数器则为空(undefined)。

此内存区域是唯一一个在Java虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域

**虚拟机栈(Stacks):**是线程私有的,生命周期与线程相同。

虚拟机栈描述的Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

人们常说的Java内存分为堆内存和栈内存,这种比较粗糙,Java内存区域的划分远比这个复杂,所指的栈 就是现在讲的虚拟机栈,或者说是虚拟机栈中局部变量表部分。

局部变量表存放了编译器可知的各种基本数据类型(字节型(byte),短整型(short),整型(int),长整型(long),字符型(char),浮点型(float),双精度型(double),布尔型(boolean).)、对象的引用(reference类型(可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置))和returnAddress类型(指向了一条字节码指令地址)

其中 lang 和double 占2个局部变量空间(slot),其余数据类型只占 1 个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法需要在帧中分配多大空间完全是确定的,在方法运行期间不会改变局部变量表的大小。

异常情况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlowError 异常;

如果虚拟机可以动态扩展,扩展时无法申请到足够的内存,就会抛出OutOfMoryError

本地方法栈:与虚拟机啊栈发挥的作用是相似的。

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> 读书笔记 -深入理解Java虚拟机----自动内存管理机制

相关推荐