读书笔记-《深入理解Java虚拟机》-JVM内存模型

2017-05-02  本文已影响30人  Crocutax

版权声明:本文来自 Crocutax 的博客 , 转载请注明出处 http://crocutax.com

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自不同的用途:

JVM内存模型图.png

程序计数器

程序计数器(Program Counter Register)是一块较小的内存空间,属于线程私有区域,此区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

作用:
当前线程所执行的字节码的行号指示器。

在虚拟机概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等都依赖此计数器。

为什么该区域属于线程私有
Java虚拟机的多线程是通过:线程轮流切换,并分配CPU执行时间的方式来实现的(CPU在任何一个确定的时刻只会执行【一条线程】中的指令)。为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,不同线程之间互不影响,独立存储。

Java虚拟机栈

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

注意事项:

本区域的两种异常:

本地方法栈

本地方法栈(Native Method Stack)与Java虚拟机栈作用类似,区别在于前者服务于Native方法,而后者服务于Java方法。

虚拟机规范中对应本地方法栈中方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机实现方式各自不同。其中Sun HotSpot虚拟机直接把本地方法栈Java虚拟机栈合二为一了。

和Java虚拟机栈一样,本地方法栈也会抛出StackOverflowErrorOutOfMemoryError异常。

Java堆

方法区

运行时常量池

直接内存

上一篇下一篇

猜你喜欢

热点阅读