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:内存泄漏的累积会造成内存溢出,所以内存泄露也根据触发的频繁程度做了一个分类:

经常发生: 发生内存泄露的代码会被多次执行,每次执行,泄露一块内存

偶然发生: 在某些特定情况下才会发生

一次性: 发生内存泄露的方法只会执行一次

隐式泄漏: 一直占着内存不释放,直到执行结束; 严格的说这个不算内存泄漏,因为最终释放掉了, 但是如果执行时间特别长,也可能会导致内存耗尽

相关推荐
Ice__Cai几秒前
Python 基础详解:数据类型(Data Types)—— 程序的“数据基石”
开发语言·后端·python·数据类型
_herbert2 分钟前
MAVEN构建分离依赖JAR
java
野犬寒鸦16 分钟前
Pipeline功能实现Redis批处理(项目批量查询点赞情况的应用)
java·服务器·数据库·redis·后端·缓存
lilv6617 分钟前
python中用xlrd、xlwt读取和写入Excel中的日期值
开发语言·python·excel
꧁༺摩༒西༻꧂22 分钟前
Spring Boot Actuator 监控功能的简介及禁用
java·数据库·spring boot
Java中文社群1 小时前
快看!百度提前批的面试难度,你能拿下吗?
java·后端·面试
丨千纸鹤丨1 小时前
Tomcat
java·tomcat
发发发发8881 小时前
leetcode 674.最长连续递增序列
java·数据结构·算法·leetcode·动态规划·最长连续递增序列
阿巴~阿巴~1 小时前
构造函数:C++对象初始化的核心机制
开发语言·c++
回忆是昨天里的海1 小时前
3.3.2_1栈在表达式求值中的应用(上)
java··后缀表达式·前缀表达式