java虚拟机里定义了若干程序在运行时会用到的运行时数据区,一些是与虚拟机相关的,随着虚拟机的创建而创建,关闭而消亡;另一些是与运行在虚拟机上的线程相关的,随着线程的创建与结束而产生和销毁。任何一个虚拟机的线程都是与一个java虚拟机栈相对应,这个虚拟机栈用来保存局部变量和运行时产生的一些中间值。
Java虚拟机栈可能发生如下异常情况:
如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量时,Java虚拟机将会抛出一个StackOverflowError异常。
如果Java虚拟机栈可以动态扩展,并且扩展的动作已经尝试过,但是目前无法申请到足够的内存去完成扩展,或者在建立新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出一个OutOfMemoryError异常
在Java虚拟机中,堆(Heap)是可供各条线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域。
Java堆可能发生如下异常情况:
如果实际所需的堆超过了自动内存管理系统能提供的最大容量,那Java虚拟机将会抛出一个OutOfMemoryError异常。
在Java虚拟机中,方法区(Method Area)是可供各条线程共享的运行时内存区域,它存储了每一个类的结构信息,例如运行时常量池(Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容、还包括一些在类、实例、接口初始化时用到的特殊方法。
方法区可能发生如下异常情况:
如果方法区的内存空间不能满足内存分配请求,那Java虚拟机将抛出一个OutOfMemoryError异常