JAVA面试题整理——内存溢出与内存泄露的区别与联系-创新互联

回忆的本人参加某公司的真实面试题,希望对你有所帮助。

成都创新互联主营乌海网站建设的网络公司,主营网站建设方案,app软件开发公司,乌海h5微信小程序开发搭建,乌海网站营销推广欢迎乌海等地区企业咨询内存溢出与内存泄露的区别与联系

在前面jvm学习整理的时候其实用过一个简单的例子了解过内存溢出,在jvm内存模型章节下,大家有兴趣的可以去看看:JVM初学 GC_knowwait的博客-博客

内存溢出

内存溢出(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:内存泄漏的累积会造成内存溢出,所以内存泄露也根据触发的频繁程度做了一个分类:
  经常发生: 发生内存泄露的代码会被多次执行,每次执行,泄露一块内存
  偶然发生: 在某些特定情况下才会发生
  一次性: 发生内存泄露的方法只会执行一次
  隐式泄漏:  一直占着内存不释放,直到执行结束; 严格的说这个不算内存泄漏,因为最终释放掉了, 但是如果执行时间特别长,也可能会导致内存耗尽

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享标题:JAVA面试题整理——内存溢出与内存泄露的区别与联系-创新互联
本文路径:http://scyanting.com/article/hdgch.html