JAVA虚拟机栈的OOM与SOF

JAVA虚拟机栈

在虚拟机规范中,这部分内存是用来描述方法执行时的数据结构,因此在此部分内存中,主要存储了方法运行时的数据。例如方法的出口,方法的参数,方法中的局部变量等。

JAVA的栈帧

JAVA的虚拟机栈是每个线程都是私有的,因此是线程安全的数据区域。每调用一个方法,都会创建一个栈帧,用来存储方法执行的数据。每个栈帧中都包含了局部变量表、操作数栈、动态连接、返回地址等。

局部变量表

局部变量表中存放着方法所需的数据(变量),基本数据类型和引用地址。局部变量表中存储单位叫变量槽,除开long和double使用两个变量槽,其余数据皆使用一个变量槽。局部变量表的大小取决于虚拟机实现的每个变量槽的大小。

操作数栈

操作数栈是用来对于变量进行操作的。

动态连接

动态连接是用来连接其他运行时所需的信息,使程序成为一个整体执行。

返回地址

返回地址是用来描述方法执行完成的结果处理方式。如返回值、程序抛出异常如何处理等等。

本文的主题

OOM

OOM是OUT OF MEMORY的简称。如果JAVA虚拟机实现可以在方法运行时可以动态扩展的时候,方法申请的栈大小超过可用内存会抛出OOM。
JAVA虚拟机栈的OOM与SOF_第1张图片

SOF

SOF是 Stack Over Flow的简称。当线程申请的内存大小超过了JAVA虚拟机栈的大小时会抛出SOF异常。
JAVA虚拟机栈的OOM与SOF_第2张图片

OOM与SOF的总结

两个都是由于内存不足导致的。OOM是因为栈的大小不足,想要继续扩展的时候,但是由于JAVA虚拟机的可用内存不足导致的。SOF是因为方法执行的时候,创建新的栈帧,但是虚拟机栈的内存不足以放下新的栈帧导致的。

你可能感兴趣的:(JVM,jvm)