JAVA虚拟机栈的OOM与SOF

JAVA虚拟机栈

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

JAVA的栈帧

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

局部变量表

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

操作数栈

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

动态连接

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

返回地址

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

本文的主题

OOM

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

SOF

SOF是 Stack Over Flow的简称。当线程申请的内存大小超过了JAVA虚拟机栈的大小时会抛出SOF异常。
在这里插入图片描述

OOM与SOF的总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值