深入理解Java虚拟机笔记(—)-运行时区域

Java 虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.

生命周期各不相同.

分为以下几个分区:

  • 方法区
  • 虚拟机栈
  • 本地方法栈
  • 程序计数器

程序计数器

较小的内存空间,当前线程所执行的字节码的行号指示器.获取下一条需要执行的指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成.

线程独立的,线程切换之后能恢复到正确的执行位置.

  • Java: 记录的是正在执行的虚拟机字节码指令的地址
  • Native: Undefined

Java 虚拟机栈

线程私有,与线程的生命周期相同.

描述对象: Java方法执行的内存模型.

新名词: 栈帧

  • 创建时机: 在执行的同时
  • 用途: 用于存储局部变量表、操作数栈、动态链接、方法出口
  • 过程: 入栈到出栈的过程,就是一个方法调用到执行完成的过程.

本地方法栈

与虚拟机栈发挥的作用类似,区别在于一个执行Java方法服务,一个执行Native方法服务.

Java堆

存放对象实例

方法区

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

运行时常量池

运行时常量池是方法区的一部分,Class文件除了有类的版本、字段、方法接口等描述信息外,还有一项信息就是常量池,用于存放编译时期生成的各种字面量和符号引用.

直接内存

NIO