java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区。
其中一些随着虚拟机启动而创建,随着虚拟机退出而销毁。
另一些是跟线程一一对应,随着线程开始和结束而创建和销毁。
1. PC寄存器:
与线程相关,每一个虚拟机线程都有自己的PC寄存器
2. java栈
java虚拟机栈,与线程相关,每个线程都有自己私有的虚拟机栈,与线程同时创建。用于存储栈帧,存储局部变量,一些尚未算好的结果,用于方法的调用和返回。栈帧本身可以在堆中分配,虚拟机栈使用的内存不要求是连续的。
虚拟机栈可能发生以下异常情况:
(1): stackOverflowError, 当线程请求分配的容量超过java虚拟机栈允许的最大容量。
(2): OutOfMemoryError, 如果java虚拟机栈可以动态扩展,且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的java虚拟机栈。
3. java堆
java堆,是可供各个线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域。垃圾回收器就处理这部分。
在虚拟机启动的时候创建。
同样java堆的内存不需要保证是连续的,容量可以是固定的,也可以是动态扩展的。
java堆可能发生OutOfMemoryError 异常: 如果实际所需的堆超过了GC所能提供的最大容量。
4. 方法区
“`
各个线程共享的运行时内存区域。存储每一个类的结构信息。比如运行时常量池,字段和方法数据,构造函数和普通方法的字节码内容。
在虚拟机启动时创建。是堆的逻辑组成部分,但是简单的虚拟机可以选择在这个区域不实现垃圾回收。
同样的,如果方法区内存不能满足内存分配要求,会抛出OutOfMemoryError 异常
“`
5. 运行时常量池
是class文件中,每一个类或接口的常量池表的运行时表示形式。 类似符号表。 运行时常量池都在java虚拟机的方法区中分配。 在加载类和接口到虚拟机后,就创建对应的运行时常量池。
同样如果构造运行时常量池的内存空间吃哦啊过了方法区所能提供的最大值时,会抛出 OutOfMemoryError 异常
6. 本地方法栈