java虚拟机运行时数据区包括方法区,虚拟机栈,本地方法栈,堆,程序计数器几个部分
其中虚拟机栈与堆就是经常被讨论的堆和栈,虚拟机栈是线程私有,它的生命周期与线程同步,每个方法在执行的同时都会创建一个帧栈,用于存储局部变量等等信息,帧栈存储编译器可以确定的各种类型的基础变量以及对象的引用变量,局部变量表会随着方法结束而释放内存。
堆是被所有线程共享的,它的唯一目的就是存放对象,对于对象的回收是基于GC来管理的,当对象不再被任何引用变量所引用的时候,会被GC回收。
方法区用于存储已经被虚拟机加载的类信息,常量,静态变量等数据,也是被所有线程所共享的。常说的运行时常量池也是方法区的一部分,class文件中除了有类的版本,字段,方法等信息外,还有一项是常量池,这些常量是在编译时确定的,在类加载的时候存放到方法区的运行时常量池中。
程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。
本地方法栈与虚拟机栈类似,都是为方法服务的,只不过虚拟机站是为java方法服务的,而本地方法栈是为虚拟机使用的native方法服务的。