(图来自网络)
1.程序计数器
线程私有----各条线程间独立存储,互不影响。
2.Java虚拟机栈(Stack)
常说的“栈内存”,虚拟机栈中局部变量表部分。局部变量表存放了编译期可知的8大基本数据类型、对象引用、returnAdress(指向了一条字节码指令的地址)。
double、long 64位,会占用2个局部变量空间(Slot),其余数据类型只占用1个。
局部变量表的内存空间分配在编译期完成。
线程私有。
有两种异常:StackOverflowError(线程请求的栈深度大于虚拟机允许的深度),OutOfMemoryError(扩展时无法申请到足够的内存)
PS:就是常理解的,栈中存放局部变量。
3.本地方法栈
为虚拟机使用的Native方法服务。
有的虚拟机将其与java虚拟机栈合并-----Sun HotSpot
4.Java堆(Heap)
所有线程共享的一块内存区域。
存放对象实例、数组。
5.方法区(Method Area,Non-Heap)
存储已经被虚拟机加载的信息:类信息、常量、静态变量、即时编译器编译后的代码 等。
各个线程共享的内存区域。
*运行时常量池(方法区的一部分)
编译期生成的各种字面量和符号引用
JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器) , VM Stack(虚拟机栈)和Native Method Stack (本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说只发生在Heap上)的原因。