JVM学习笔记-1 运行时内存区域

JVM运行时,首先需要类加载器(ClassLoader) 加载所需类的字节码,加载完毕交由执行引擎执行,执行过程中需要一段空间来存储数据(类比CPU与主存)。这段内存空间的分配和释放过程正是我们所关心的,称为运行时数据区。

JVM运行时内存区域主要分为 程序计数器,虚拟机栈,本地方法栈,虚拟机堆,方法区五个主要区域。(Java内存模型和JVM内存区域是两个概念不要混淆)

JVM学习笔记-1 运行时内存区域_第1张图片
1. 程序计数器
程序计数器(Program Counter Register)记录当前线程所执行的字节码的行号指示器。
作用:Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的。处理器在同一时刻只能处理一个线程的指令。因此,为了线程切换后能恢复到正确的执行位置。每条线程都需要一个独立的程序计数器。(线程私有)

2. Java虚拟机栈
Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的
生命周期与线程相同。
虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame[1])用于存储局部变量表、 操作数栈、 动态链接、 方法出口等信息。 每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

3. 本地方法栈
本地方法栈(Native Method Stack)与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。

4. 虚拟机堆
Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。
Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。 此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”。 它是线程共享的
Java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。 不过无论如何划分,都与存放内容无关,无论哪个区域,存储的都仍然是对象实例,进一步划分的目的是为了更好地回收内存,或者更快地分配内存。

5. 方法区
方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、 常量、 静态变量、 即时编译器编译后的代码等数据。 虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。

6.运行时常量池
运行时常量池(Runtime Constant Pool)是方法区的一部分。 Class文件中除了有类的版本、 字段、 方法、 接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。
运行时常量池具备动态性,使得运行期间也可将新的常量放入池中。例如String类的intern() 方法。

你可能感兴趣的:(JVM虚拟机)