下面的示意图显示了在Java虚拟机中内存的分配和使用情况:
1. 每个线程的数据区(非共享)
每个线程的数据区包括程序计数器寄存器(Program Counter Register),Java虚拟机栈(JVM Stack),原生方法栈(Native Method Stack)。
当一个线程启动时就会生成这三部分数据区。
程序计数器寄存器(Program Counter Register):这个不多说,学过汇编就知道,PC计数器嘛,控制程序的执行步骤
Java虚拟机栈(JVM Stack):包含了下面会提到的框架(frames)
原生方法栈(Native Method Stack):用于支持原生方法,比如非Java语言的方法
2. 所有线程共享的数据区
所有线程都共享上图中所示的Heap和Method Area两部分数据区
Heap:该数据区在JVM启动后就创建,存放数组和对象,GC在该数据区工作
Method Area:该数据区存储运行时的常量池,域和方法的数据,方法以及构造器的代码
Runtime Constant Pool:它是在一个类文件中的常量池表的每个类或每个接口的运行时表示,包含了在编译时已知的数字以及在运行时必须解析的域引用等几种常量值
栈Stack包含框架Frame,当一个方法被调用的时候框架就会被推送到栈Stack中,而框架中则包含了临时变量数组,操作数栈和常量值池的引用。