JAVA虚拟机栈
在虚拟机规范中,这部分内存是用来描述方法执行时的数据结构,因此在此部分内存中,主要存储了方法运行时的数据。例如方法的出口,方法的参数,方法中的局部变量等。
JAVA的栈帧
JAVA的虚拟机栈是每个线程都是私有的,因此是线程安全的数据区域。每调用一个方法,都会创建一个栈帧,用来存储方法执行的数据。每个栈帧中都包含了局部变量表、操作数栈、动态连接、返回地址等。
局部变量表
局部变量表中存放着方法所需的数据(变量),基本数据类型和引用地址。局部变量表中存储单位叫变量槽,除开long和double使用两个变量槽,其余数据皆使用一个变量槽。局部变量表的大小取决于虚拟机实现的每个变量槽的大小。
操作数栈
操作数栈是用来对于变量进行操作的。
动态连接
动态连接是用来连接其他运行时所需的信息,使程序成为一个整体执行。
返回地址
返回地址是用来描述方法执行完成的结果处理方式。如返回值、程序抛出异常如何处理等等。
本文的主题
OOM
OOM是OUT OF MEMORY的简称。如果JAVA虚拟机实现可以在方法运行时可以动态扩展的时候,方法申请的栈大小超过可用内存会抛出OOM。
SOF
SOF是 Stack Over Flow的简称。当线程申请的内存大小超过了JAVA虚拟机栈的大小时会抛出SOF异常。
OOM与SOF的总结
两个都是由于内存不足导致的。OOM是因为栈的大小不足,想要继续扩展的时候,但是由于JAVA虚拟机的可用内存不足导致的。SOF是因为方法执行的时候,创建新的栈帧,但是虚拟机栈的内存不足以放下新的栈帧导致的。