📰运行时数据区域(Runtime Data Area)
程序计数器:
- 可以将它看作是Java字节码文件的行号指示器,字节码指示器通过修改这个值来获取下一条需要执行的字节码指令
- 它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复都由程序计数器来实现
- 如果执行的是Java方法:程序计数器记录的是字节码指令的地址
- 如果执行的是Native方法:程序计数器值为
Java虚拟机的多线程是通过线程轮流切换,分配处理器时间来实现的,同一时刻,处理器只会执行一条线程中的指令,为了保证切换之后线程能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,且各线程之间的计数器互不影响,所以程序计数器是线程隔离的数据区域,是各个线程私有的
Java虚拟机栈
- 用于存储局部变量表、操作数栈、动态连接、方法出口
- 它是线程私有的,生命周期和线程相同
本地方法栈
- 它的作用和Java虚拟机栈基本相同,区别是 虚拟机栈为虚拟机执行Java方法服务(字节码)服务,而本地方法栈为虚拟机执行本地方法而服务
- 它也是线程私有的,生命周期和线程想同
Java堆
- 唯一目的就是存放对象的实例
- 被所有线程所共享
- 是虚拟机管理的最大的一块内存区域,在项目启动时创建
- 大小可以固定也可以扩展,物理可以不连续,逻辑上要连续
- Java堆是垃圾收集器管理的内存区域,所以可以称为”GC堆“
方法区(Method Area)
- 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据
- 和Java堆一样,它也是被各个线程所共享的内存区域
运行时常量池
- 运行时常量池是方法区的一部分
- 用于存储编译过程中产生的常量池表
Class文件中除了有类的版本、字 段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生 成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中
文章内容来自《深入理解Java虚拟机》的读书笔记,有误欢迎留言指正