Java内存区域与内存溢出异常
2.1 概述
Java程序员把内存控制权交给Java虚拟机。
2.2 运行时数据区域
Java虚拟机在执行Java程序的过程中会把所管理的区域划分成若干块,各自有不同用途,其中堆和方法区是线程共享的,虚拟机栈,本地方法区和程序计数器都是线程私有的。
2.2.1 程序计数器
程序计数器是一块较小的内存区域,作为当前线程所执行的字节码的行号指示器。对于Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是Natvie方法,计数器为空。
此区域是唯一一个在Java虚拟机规范里没有规定任何OOM(OutOfMemeoryError)情况的区域。
线程私有。
2.2.2 Java虚拟机栈
生命周期与线程相同;
每个方法被执行时都会常见一个栈帧,用于存储局部变量表、操作栈、动态链接、方法出口信息等。每一个方法被调用直至执行完成的过程,就对应着一个栈在虚拟机栈中从入栈到出栈的过程。
局部变量表存放了编译期可知的各种数据类型(8种基础数据类型)、引用对象和returnAddress类型(指向了一条字节码指令的地址)。它所需的内存是在编译期完成分配,方法运行期间不会改变。
虚拟机栈会产生两种异常:当请求的栈深大于虚拟机允许的栈深,会抛出StackOverflowError;当虚拟机栈拓展到无法再申请内存时,会抛出OOM异常。
线程私有。
2.2.2 本地方法栈
与虚拟机栈类似,虚拟机栈为Java方法服务,本地方法栈为Native服务,有些版本的虚拟机会把两者合并在一起。
线程私有。