JVM内存区域
内存划分
JVM虚拟机在运行时将内存空间划分为几个区域,这些区域有不同的功能、创建时间和销毁时间。虚拟机内存划分只是从功能上进行的分割,不同的虚拟机的版本有不同的方式实现方式。
程序计数器(PC):存储各个线程运行的当前指令的地址。
虚拟机栈(Stack):每个线程在运行时都会创建自己的栈,进入每个方法时创建一个栈帧压入栈中,用于保存当前方法内的局部变量、操作数栈、方法出口地址等。
堆(Heap):虚拟机中空间最大的内存区域,各个线程共享的区域,存储虚拟机中绝大数对象的。为了更方便的管理这块区域,各种垃圾回收算法会将这个区划分为更细致的区域,例如新生代、老年代等。
方法区(Method Area):各个类被加载后的==类信息、常量、静态变量、方法代码==等内容存储的空间。
常量池(Constant Pool):方法区中存储常量的信息,这里的常量不仅仅指的是Java语言层面的常量,还有一些字面量和符号引用。常量池可以在运行时添加,例如String的intern()方法。
直接内存(Direct Memory):一块虚拟机以外的内存空间,是宿主的内存空间。在NIO场景中运用,提高虚拟机与外界数据交互的效率。
**本地方法栈(Native Stack)**:虚拟机在调用本地方法时调用的栈空间。
虚拟机栈
虚拟机使用栈存储一个线程的方法调用链。栈内有若干栈帧,存储着调用链中方法的信息。一个栈帧中存储以下信息:
1 | | | |
操作数栈
JVM使用操作数栈暂存字节码指令执行过程中的数据
方法动态连接
方法返回地址
局部变量表
堆
。。。
方法区
。。。