JAVA面试题整理——内存溢出与内存泄露的区别与联系
内存溢出与内存泄露的区别与联系
在前面jvm学习整理的时候其实用过一个简单的例子了解过内存溢出,在jvm内存模型章节下,大家有兴趣的可以去看看:JVM初学 GC_knowwait的博客-CSDN博客
内存溢出
内存溢出(out of memory)顾名思义,就是程序申请内存时,没用足够的内存可以使用,假设我们程序运行需要100M内存,但是我们的内存空间只剩下10M,那我们程序肯定运行不起来,这就是内存溢出了,这种一般指元空间溢出。
不过通常情况下,我们程序运行使用的是系统内存,一般不会出现内存不足以支撑程序运行的情况,那为什么还会出现内存溢出呢?这种溢出就是我们在程序开发时遇到的堆溢出了。
我们知道,我们创建的对象是放在堆中的,通常我们通过设置-Xms和-Xmx参数来调整堆内存大小,但是我们不能无限调整其大小,也就是说我们不能无限创建对象,或者说我们创建的对象在不用时要及时的释放(GC),才能满足程序不断运行的需要。假如我们一直在new对象,却不释放内存空间,这时候内存占满了,也就出现内存溢出了,这通常是因为代码原因导致的,例如:
1、代码中存在死循环或者递归调用没有出口
2、大循环重复产生大量新对象实体。
3、数据库一次性查询数据条数过多,导致内存中加载的数据量过于庞大。
4、检查List、Map等集合对象是否有使用完后,未清除的问题,List、Map等集合对象会始终存有对对象的引用。
内存泄露
讲完了内存溢出,我们再来看看内存泄露,其实依我拙见,我们只要清楚的了解内存溢出就可以了,所以我面试的时候也并没有答出来内存泄露是啥,但是既然面试问了,我们还是要了解一下。
内存泄露(Memory Leak)就是我们程序运行中漏掉了一部分内存,那这部分内存怎么漏掉的呢,其实就是我们没有及时的释放掉一些不用的内存空间,举个例子:声明了一个A对象,占用内存空间1M,A对象已经用完了,对于我们程序来说A已经没有意义了,如果我们没有及时的释放掉A的内存,那这1M我们就不可能在后续利用起来,看起来就像这部分内存泄露了一样。
内存泄露对我们程序影响大么?
按照上面的例子,好像只是漏掉了一部分内存,不影响程序的使用,但是这个内存泄露其实是一个累积的过程,这里漏一块那里漏一块,最终内存不够用了,造成了什么现象?就是内存溢出,所以这就串起来了。
内存泄露的几种情况:
1、静态集合类
上述提到List、Map等集合对象会始终存有对对象的引用,如果这些集合是静态(static)的,那么它们的生命周期与JVM程序一致,那集合中的对象在程序结束之前将不能被释放,造成内存泄露。
2、单例模式
和静态集合类似,它的生命周期也与JVM程序一致,如果单例对象持有外部对象的引用,那么这个外部对象也不会被回收,那么就会造成内存泄漏。
3、各种连接,如数据库连接、网络连接和IO连接等
这些连接创建后,创建的连接对象,只有关闭连接后垃圾回收器才会回收这部分内存,如果使用完未关闭,一直占用内存也会造成内存泄露。
当然还有其他的情况,大家有兴趣的可以再翻翻资料了解下,对于面试来说,我认为这些足够了。
ps:内存泄漏的累积会造成内存溢出,所以内存泄露也根据触发的频繁程度做了一个分类:
经常发生: 发生内存泄露的代码会被多次执行,每次执行,泄露一块内存
偶然发生: 在某些特定情况下才会发生
一次性: 发生内存泄露的方法只会执行一次
隐式泄漏: 一直占着内存不释放,直到执行结束; 严格的说这个不算内存泄漏,因为最终释放掉了, 但是如果执行时间特别长,也可能会导致内存耗尽
相关文章:
JAVA面试题整理——内存溢出与内存泄露的区别与联系
内存溢出与内存泄露的区别与联系 在前面jvm学习整理的时候其实用过一个简单的例子了解过内存溢出,在jvm内存模型章节下,大家有兴趣的可以去看看:JVM初学 GC_knowwait的博客-CSDN博客 内存溢出 内存溢出(out of memory)…...

L50--- 104. 二叉树的最大深度(深搜)---Java版
1.题目描述 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 2.思路 这个二叉树的结构如下: 根节点 1 左子节点 2 右子节点 3 左子节点 4 计算过程 从根节点 1 开始计算: 计算左子树的最大深度: 根节点 2…...

Linux 中 “ 磁盘、进程和内存 ” 的管理
在linux虚拟机中也有磁盘、进程、内存的存在。第一步了解一下磁盘 一、磁盘管理 (1.1)磁盘了解 track( 磁道 ) :就是磁盘上的同心圆,从外向里,依次排序1号,2号磁盘........等等。…...
test_pipeline
test_pipeline 是一个测试管道(test pipeline)的定义。 在计算机视觉任务中,通常需要对输入图像进行一系列的预处理操作,以便将其适配到模型的输入要求或提高模型的性能。测试管道就是用于定义这些预处理操作的一系列步骤。 在给…...
使用甲骨文云arm服务器安装宝塔时nginx无法卸载
使用甲骨文云arm服务器安装宝塔 其他环境都能安装上 唯独nginx安装完不运行 卸载了几次以后还无法卸载了. 修复 重启都不行. 差点就重建主机了. 最后靠下面的命令 就卸载掉了 然后重装就把nginx安装好了 mv /www/server/nginx/sbin/nginx /tmp/nginx_back mv /etc/in…...

C++青少年简明教程:C++的指针入门
C青少年简明教程:C的指针入门 说到指针,就不可能脱离开内存。了解C的指针对于初学者来说可能有些复杂,我们可以试着以一种简单、形象且易于理解的方式来解释: 首先,我们可以将计算机内存想象成一个巨大的有许多格子的…...
Apache Doris 基础 -- 数据表设计(分层存储)
1、应用场景 未来一个重要的用例是类似于ES日志存储,其中日志场景中的数据是根据日期分割的。许多数据都是查询不频繁的冷数据,因此需要降低此类数据的存储成本。考虑到节约成本: 来自不同厂商的常规云磁盘的定价比对象存储更昂贵。Doris 集群实际在线…...
使用Spring Boot设计一套BI系统
商业智能(Business Intelligence,简称BI)系统是一种将数据转化为可操作信息,帮助企业进行决策支持的技术与工具的集合。随着大数据时代的到来,BI系统在企业中的应用变得越来越广泛。本文旨在探讨如何使用Spring Boot框…...
2024.6.12总结
今天是排毕业照的日子,拍照的时候并没有太过兴奋。后来受到主管说明天就能签offer了,这才喜极而泣。 自从得知自己面试通过后,我是非常高兴,开始幻想着今后的生活。可是,后面在等offer的过程中,我是无比的…...
1027 - 求任意三位数各个数位上数字的和
问题描述 对于一个任意的三位自然数 x ,编程计算其各个数位上的数字之和 S 。 输入 输入一行,只有一个整数 x(100≤x≤999) 。 输出 输出只有一行,包括 1 个整数。 样例 输入 123 输出 6 以下是C实现的代码: 代码1 #…...

K8s 卷快照类
卷快照类 卷快照类 这个警告信息通常出现在使用 kubectl 删除 Kubernetes 集群资源时,如果尝试删除的是集群作用域(cluster-scoped)的资源,但指定了命名空间(namespace),就会出现这个警告。 集…...
从零手写实现 nginx-23-directive IF 条件判断指令
前言 大家好,我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的,可以参考我的另一个项目: 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …...

08_基于GAN实现人脸图像超分辨率重建实战_超分辨基础理论
1. 超分辨的概念与应用 我们常说的图像分辨率指的是图像长边像素数与图像短边像素数的乘积,比如iPhoneX手机拍摄照片的分辨率为 4032px3024px,为1200万像素。 显然,越高的分辨率能获得更清晰的成像。与之同时,分辨率越高也意味着更大的存储空间,对于空间非常有限的移动设…...
React.ReactElement 与 React.ReactNode
React.ReactNode 在 JSX 中作为子元素传递的所有可能类型的并集,这是对子元素的一个非常宽泛的定义。 <RNode><p>One element</p></RNode><RNode><><p>Fragments for</p><p>More elements</p></&g…...
深度解析服务发布策略之蓝绿发布
目录 什么是蓝绿发布 蓝绿发布的优点 蓝绿发布的缺点 蓝绿发布的实现步骤 小结 在软件开发和运维中,发布新版本是一个风险较高的操作。为了降低风险,提高发布的稳定性和可靠性,通常会采取一系列的技术策略。其中蓝绿发布(Blu…...
【Mysql】 深入理解MySQL的执行计划
文章目录 前言一、字段解释二、代码实现三、总结 前言 在日常的数据库操作中,我们经常会遇到一些复杂的查询,这些查询可能会涉及到多个表的联合查询,或者是一些复杂的条件筛选。为了更好地理解和优化这些查询,了解MySQL的执行计划…...
说下你对Spring IOC 的理解
说下你对Spring IOC 的理解 1. Spring IOC是一个管理对象之间依赖关系的容器,它实现了依赖注入技术,可以解决传统的紧耦合问题,降低了项目维护难度。 2. Spring IOC将对象之间的依赖关系交由容器来管理对象,开发者只需要告诉容器…...

前缀和算法:算法秘籍下的数据预言家
✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一. 前缀和算法的介绍 二、前缀和例题 2.1 【模版】前缀和 2.2 【模板】二维前缀和 2.3 寻找数组的中间下标 2.4 除自身以外数组的乘积 2.5 和为k的子数组 2.6 和可被k整除的子数组 2.7 …...

基于PointNet / PointNet++深度学习模型的激光点云语义分割
一、场景要素语义分割部分的文献阅读笔记 1.1 PointNet PointNet网络模型开创性地实现了直接将点云数据作为输入的高效深度学习方法(端到端学习)。最大池化层、全局信息聚合结构以及联合对齐结构是该网络模型的三大关键模块,最大池化层解决了…...

LabVIEW调用DLL时需注意的问题
在LabVIEW中调用DLL(动态链接库)是实现与外部代码集成的一种强大方式,但也存在一些常见的陷阱和复杂性。本文将从参数传递、数据类型匹配、内存管理、线程安全、调试和错误处理等多个角度详细介绍LabVIEW调用DLL时需要注意的问题,…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...