说明
本文是在阅读深入理解java虚拟机整理笔记,内容可能有误,会持续修正
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。主要包括以下区域:
image.png
注:方法区与堆为所有线程共享的区域。虚拟机、本地方法栈、程序计数器为线程隔离数据。
1、方法区(Method Area)
- 【作用】:
线程共享区域。存储已经被虚拟机加载的类型信息,常量、静态变量,即时编译器编译后的代码缓存等数据。
1.1、运行时常量池(Runtime Constant Pool)
Class文件中常量池表(Constant Pool Table),用于存放编译器生成的各类字面量与符号引用。
2、堆(Heap)
- 【特点】:虚拟机管理内存最大的一块。线程共享。垃圾收集器管理的内存区域
- 【作用】:唯一目的就是存放对象实例
3、java虚拟机栈(VM Stack)
虚拟机栈帧
- 【特点】:线程私有,生命周期与线程相同
- 【作用】:描述的是Java方法执行的线程内存模型。每个方法被执行的时候, Java虚拟机都
会同步创建一个栈帧。
3.1 栈帧(stack Frame)
- 【作用】:存储局部变量表、 操作数栈、 动态连接、 方法出口等信
息。
4、本地方式栈(Native Method Stack)
- 【作用】: 与虚拟机栈所发挥的作用是非常相似。本地方法栈则是为虚拟机使用到的本地(Native)方法服务
5、程序计数器(Progem Counter Register)
- 【特点】:线程私有,内存较小。唯一一个没有OutOfMemoryError情况的区域。
- 【作用】:
当前线程所执行的字节码的行号指示器。如果是Java方法, 计数器记录的是正在执行的虚拟机字节码指令的地址。如果是本地方法(Native)。 这个计数器值则应为空(Undefined)。
址;
5.1 为什么说程序计数器区为线程私有。
java多线程是通过线程轮流切换、 分配处理器执行时间的方式来实现。为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器。











网友评论