常见的栈溢出StackOverFlow 与 内存溢出OutOfMemory的区别

news2024/11/24 20:47:41

0、前言:内存模型

        对于多线程运行情况下的jvm内存,我们应当知道:

        每创建一个线程,jvm就会为其分配一块线程私有的工作内存,其中包括程序计数器、栈,等等。
        对于每一个线程私有的栈,当线程执行方法时,栈内都会分配一块栈帧,用于保存方法的局部变量表、方法返回地址等信息。
                                                                                        ——详细见《深入理解java虚拟机》

概括地看,就是说:
        线程会占用“总的内存”、运行方法所创建的栈帧会占用“栈的内存”

以下内容都可以结合前言这一节来理解:

1、StackOverFlow 

         栈溢出,顾名思义,栈爆掉了,栈为什么会爆掉?因为里面的栈帧太多了造成的呗!

         如果不断地调用方法,不断地往一个栈里压入栈帧,就会造成StackOverFlow,例如,让同一个线程递归地调用方法:

        在每次递归调用时,JVM会将当前方法的局部变量、参数和返回地址等信息保存在栈帧中,并将新的栈帧推入栈中。
        当递归的层数过多时,就会产生大量的栈帧,占用过多的栈内存空间。如果超过了栈的容量限制,就会发生栈溢出,抛出StackOverflowError异常。

代码示例:

public class RecursionExample {
    public static void recursiveMethod() {
        recursiveMethod(); // 递归调用
    }

    public static void main(String[] args) {
        try {
            recursiveMethod();
        } catch (StackOverflowError e) {
            System.out.println("StackOverflowError: " + e.getMessage());
        }
    }
}

 2、OutOfMemory(OOM)

        内存溢出,顾名思义,内存爆掉了。为什么内存会爆掉呢?那就有可能是栈创建太多了!

        对比前文,例如,如果应用程序中创建了大量线程,并且每个线程都占用了一定的内存资源,那么JVM中可用的内存可能会被耗尽,导致OutOfMemoryError。

        此外,内存泄漏也有可能导致OutOfMemoryError:
        应用程序中的对象无法被垃圾回收器正确释放时,会导致内存泄漏。这可能是因为持有对对象的引用,并且这些对象不再需要,但仍然存在于内存中。随着时间的推移,内存中的对象越来越多,最终耗尽了可用的内存资源。

3、总结

        从总体角度看,栈是在内存里面的。
        栈溢出就是栈满了,内存溢出就是内存满了。
        引用另一篇文章http://t.csdn.cn/t1Bd1里的一句话:

        可以把内存比作是一个大箱子,栈是一个小箱子,栈溢出是指小箱子装不下了;而栈内存溢出是大箱子在也装不下小箱子了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么限制文件打开次数、打开时间?

一些公司出于业务需求,可能会给客户或者合作伙伴发一些涉密图纸、文档、文件等重要文件,但是又不想文件被外发泄露随意传播,今天就教大家一个方法限制文件外发后别人打开这个文件的打开次数、打开时间、另存为等操作。 设置方法 本篇文章测试…

page _refcount和_mapcount字段

linux page有两个非常重要的引用计数字段_refcount和_mapcount,都是atomic_t类型,其中,_refcount表示内核中应用该page的次数。当_refcount 0时,表示该page为空闲或者将要被释放。当_refcount > 0,表示该page页面已…

APP-脱壳+反编译

APP反编译加固-自动查壳脱壳 为什么要脱壳? 因为不脱壳无法进行反编译 查壳工具:https://pan.baidu.com/s/1rDfsEvqQwhUmep1UBLUwSQ 密码: wefd 脱壳工具:https://github.com/CodingGay/BlackDex 查壳演示: 使用Java运行jar包&a…

浙江大学软件学院2022保研经历分享

首先,我想强调一点,如果我们只是一个普通的非211,985的本科生,一定要参加浙江大学每年7月份组织的夏令营,因为浙大的夏令营是一个海王营,基本上不会对入营的学生做筛选,但是要想获得优秀营员&am…

pandas笔记:groupby整理

0 数据集 # Visual Python: Data Analysis > File vp_df pd.read_csv(https://raw.githubusercontent.com/visualpython/visualpython/main/visualpython/data/sample_csv/fish.csv) vp_df 1 单列聚合 vp_df.groupby(Type)[Kg].mean()Type mackerel 1.417456 salmon…

【C语言项目】三子棋

文章目录 项目思路一、分文件进行创建二、进入游戏前的目录2.1 目录的功能:2.2 目录界面:2.3 选择进入或退出游戏2.4 多次重玩功能 三、画出棋盘3.1 写出棋子3.2 初始化棋盘3.2 画出棋盘的框架3.3 代码实现 四、玩家落子4.1 落子逻辑4.2具体情况分类讨论…

初识C++(下)——“C++”

各位CSDN的uu们你们好呀,今天终于是小雅兰的初识C的下的文章啦,下面,让我们进入C的世界吧!!! 内联函数 我们首先得知道:C中的内联函数是用来解决C语言中宏的坑的!!&…

jenkins中配置了发送邮件,构建后却没有发邮件Not sent to the following valid addresse

【问题描述】:jekins中配置了发送邮件,构建后却没有发邮件的问题,构建报错:Not sent to the following valid addresse 【报错显示】: 【问题定位】:Extended E-mail Notification中,没有配置…

【Docker】Docker的使用案例以及未来发展、Docker Hub 服务、环境安全的详细讲解

前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 📕作者简介:热…

LabVIEW - 串口通信

1. 题目 使用并行程序设计技术,实现串口通信/TCP通信/UDP通信(任选3者一种,其中TCP为客户端)数据发送和数据接收功能在各自的线程中实现,即一个线程只管处理数据发送功能的实现,另一个线程只管数据接收和数…

P2698 [USACO12MAR] Flowerpot S

P2698 [USACO12MAR] Flowerpot S 文章目录 P2698 [USACO12MAR] Flowerpot S题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路分析code [P2698 USACO12MAR] Flowerpot S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 Farmer John has been having …

【漏洞复现】厦门才茂通信网关formping远程命令执行漏洞

文章目录 前言声明一、漏洞描述二、漏洞复现 前言 厦门才茂通信网关formping存在远程命令执行漏洞,攻击者可通过特定payload对目标服务器发起攻击,造成不可估量的影响。 声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提…

文心一言 VS 讯飞星火 VS chatgpt (65)-- 算法导论6.5 4题

四、在 MAX-HEAP-INSERT 的第 2行,为什么我们要先把关键字设为 -∞ ,然后又将其增加到所需的值呢? 文心一言: 在 MAX-HEAP-INSERT 算法的第二行将关键字设为 -∞,是为了保持堆的性质。堆是一种二叉树结构,其中每个节…

python调用文心千帆大模型

一、登录智能云控制台 https://console.bce.baidu.com/ 二、创建AI应用 已登录状态下,进入控制台创建应用 https://console.bce.baidu.com/ai/#/ai/easydlLiteNlp/app/list 应用创建后获取AppID、API Key、Secret Key 三、API调用 import requests import jso…

uniapp项目集成本地插件

在项目根目录下创建nativeplugins文件夹 拷贝插件到目录nativeplugins 在manifest.json -> App原生插件配置 -> 本地插件里勾选插件 删除本地基座和手机app从新自定义基座运行

大白话讲讲 Go 语言的 sync.Map(一)

阅读本文大约需要 4.25 分钟。 程序是枯燥乏味的。 在讲 sync.Map 之前,我们先说说什么是 map(映射)。 我们每个人都有身份证号码,如果我需要从身份证号码查到对应的姓名,用 map 存储是非常合适的。 map[000...001…

[驱动开发]字符设备驱动应用——点灯

点亮开发板stm32mp157的三盏灯 //头文件 #ifndef __LED_H__ #define __LED_H__//封装GPIO寄存器 typedef struct { volatile unsigned int MODER; // 0x00volatile unsigned int OTYPER; // 0x04volatile unsign…

C++面向对象三大特性 -- 继承

目录 一、继承的概念和定义1.1 继承的概念1.2 继承定义1.2.1定义格式1.2.2 继承方式和访问限定符1.2.3 继承基类成员访问方式的变化 二、父类和子类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承和友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承八…

小程序之移花宫-自定义底部标签图标---【浅入深出系列005】

浅入深出系列总目录在000集 如何0元学微信小程序–【浅入深出系列000】 不会导入/打开小程序的看这里 让别人的小程序长成自己的样子-更换window上下颜色–【浅入深出系列001】 文章目录 本系列校训学习资源的选择 学习目标图标的注意事项图标资源打开小程序动手实践找到图标最…

k8s使用helm部署Harbor镜像仓库并启用SSL

1、部署nfs存储工具 参照:https://zhaoll.blog.csdn.net/article/details/128155767 2、部署helm 有多种安装方式,根据自己的k8s版本选择合适的helm版本 参考:https://blog.csdn.net/qq_30614345/article/details/131669319 3、部署Harbo…