JAVA虚拟机运行时内存分配
- PC寄存器
- JAVA栈
- JAVA堆
- 方法区
- 运行常量池
- 本地方法栈
PC寄存器
每一条java虚拟机线程都有自己的pc寄存器,任意时刻java虚拟机只会执行一个方法的代码,若该方法不是native的pc寄存器保存正在执行的字节码指令地址,如果是native的pc寄存器的值为undefined(未定义)
JAVA 栈
每一条java虚拟机线程都有自己私有的java虚拟机栈,这个栈与虚拟机线程被同时进行创建,用于存储局部变量和一些没有计算好的结果,java虚拟机栈不需要保证内存是连续的。
请求分配内存时超出虚拟机允许的最大容量*Error
栈在尝试扩展空间没有申请到足够的内存OutOfMemoryError
JAVA 堆
堆提供一个可以供个个线程共享的运行时内存区域(对象,数组分配内存),java虚拟机堆在虚拟机启动时就被创建了,他存储自动内存管理系统(垃圾回收器)所管理的各种对象。
堆内存超过内存管理最大容量OutOfMerryError
方法区
方法区提供一个可以供个个线程共享的运行时内存区域,方法区在虚拟机启动时创建,方法区是堆的逻辑组成部分,但简单的虚拟机实现在这个区域可以不实现垃圾收集和回收。
运行常量池
运行常量池在方法区中分配。他是每一个类或接口在运行时的表达形式
本地方法栈
java虚拟机实现过程中可能用到传统的C栈(C Stack)来支持native方法(用其他语言编写的方法),这个栈就是本地方法栈