堆(Heap)
堆是一块线程共享的内存区域,用来存储对象,包括数组等
栈(VM Stack)
java虚拟机栈:每个方法在访问的时候都会创建一个栈帧,栈帧是每个线程私有的内存,不会被其它线程访问到,用于保存方法中用到的参数、局部变量、返回值等信息。
本地方法栈:与 java 虚拟机栈发挥的作用类似,不过它是为 native 方法服务的。
方法区(Method Area)
方法区是一块线程共享的内存区域,用来存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码数据
程序计数器(Program Counter Register)
每个线程都有一个程序计数器,字节码解释器工作就是通过程序计数器来选取下一条需要执行的指令来决定是循环、跳转、分支、异常处理等。在多核处理器中,为了保证线程切换运行后能再次运行时能够找到之前运行的位置继续运行。
我们来看下这段代码在 JVM 中是如何存储的
class Test {
static int val = 100;
int a = 1;
private Test(int a) {
this.a = a;
}
public static void main(String[] args) {
Test t1 = new Test(1);
Test t2 = new Test(2);
int a = 10;
}
}