1. 程序计数器(The pc Register)
作用域:线程私有。
作用:记录当前线程正在执行的Java虚拟机指令的地址 。
2. JVM栈( Java Virtual Machine Stacks)
作用域:线程私有。
作用:用栈帧来保存线程在执行方法时的局部变量和结果,并在方法调用和返回中发挥作用。
特点:
- 伴随一个线程的创建而创建。
- Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames, frames may be heap allocated.(不是很理解这一句)
- 线程中同时存在的栈帧超过了最大栈容量时会抛出
StackOverflowError。 - 如果JVM栈支持动态扩容,当应用可用内存不够本次扩容时,或者当创建一个新线程,剩余内存不足以新建一个JVM栈时会抛出
OutOfMemoryError。
3. 堆(Heap)
作用域:线程共享。
作用:为所有类实例和数组分配内存。
特点:
- 随着虚拟机启动而创建 。
- garbage collector机制。
- 如果garbage collector提供的堆内存不够计算所需要的,Java虚拟机就会抛出
OutOfMemoryError。
4. 方法区(Method Area)
作用域:线程共享。
作用:.class加载进内存之后需要有个地方保存字节码代表的信息,方法区就用来存储每个类的结构,比如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括在类和实例初始化以及接口初始化中使用的特殊方法。
特点:
- 随着虚拟机启动而创建 。
- 逻辑上属于堆的一部分,但是实现简单,不需要进行垃圾回收和compact(不知道怎么翻译合适)。
- 如果方法区中的内存无法满足分配请求,Java虚拟机将抛出
OutOfMemoryError。
5. 运行时常量池( Run-Time Constant Pool)
作用域:线程共享。
作用:它包含几种类型的常量,范围从编译时已知的数值字面值到必须在运行时解析的方法和字段引用。
特点:
- 是由方法区内存分配的。
- 在加载类或接口时,如果构建运行时常量池需要的内存超过了Java虚拟机的方法区域可用的内存,那么Java虚拟机将抛出
OutOfMemoryError。
6. 本地方法栈(Native Method Stacks)
类比JVM栈,用来支持本地方法。