今天我们来研究一下JVM的内存管理
Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK. 1.8 和之前的版本略有不同,下面会介绍到。
先偷两张图来形象的介绍一下JVM里面的内存管理
JDK 1.8 之前:
JDK 1.8 :
线程私有的:
-
程序计数器
-
虚拟机栈
-
本地方法栈
线程共享的:
-
堆
-
方法区
-
直接内存 (非运行时数据区的一部分,包括1.8之后的元空间)
接下来我们详细介绍一下各个部分
程序计数器
程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完成。
另外,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。
简单来说,程序计数器的作用就是:1、控制代码的流程;2、多线程情况下,记录当前线程运行到了哪个地方
Java 虚拟机栈
与程序计数器一样,Java 虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是 Java 方法执行的内存模型,每次方法调用的数据都是通过栈传递的。
Java 内存可以粗糙的区分为堆内存(Heap)和栈内存 (Stack),其中栈就是现在说的虚拟机栈,或者说是虚拟机栈中局部变量表部分。 (实际上,Java 虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法