JVM内存结构
JVM在运行java程序时将运行时数据划分成几种不同格式的数据,分别存储在不同的区域里,这些数据又统一称为运行时数据,而java虚拟机规范又将java运行时数据划分为以下6种.
- pc寄存器
- 栈区
- 堆区
- 方法区
- 运行时常量
- 本地方法栈
严格来说这是一种数据结构,它用于保存当前正常执行的程序的内存地址,同时java程序是多线程执行的,所以需要一个记录员记录下每一个线程执行到哪一条指令.
栈总是和线程关联在一起的,每创建一个线程jvm就会为这个线程创建一个对应的java栈,而每个java栈中又会有多个栈帧,另外有一点需要注意,java栈与java线程是对应起来的,这个数据不是线程共享的,所以我们不用关心它的数据一致性.
堆区是存放java对象的地方,也是开发人员最应该关注的区域,堆区中所有对象都被线程共享,访问时需要关注线程同步问题.
方法区是存放类结构的地方,当class被加载到jvm时会被存放在不同的数据结构中,而其常量,域,方法数据,方法体,构造函数等都存放在此区域.
包括存放编译期数字常量,方法或者域引用,它是方法区一部分,其存储也受方法区规范约束,如果常量池无法分配,也会出现OOM异常.
本地方法栈是为jvm运行native方法准备的空间,由于很多native方法使用c实现,所以也可以称作c栈.