什么是内存泄漏?

108 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情

什么是内存泄漏?与内存溢出有什么关系?

内存泄漏英文翻译是 Memory Leak 是指本来没有用的对象不会再用到的对象还继续占用着内存,并且没有再合适的时机去释放占用的内存,我们就称之为内存泄漏。
比如说我们创建了某个对象,使用完毕后它还没有释放对应的内存还继续占用着,并且 jvm 垃圾回收的时候也没有成功的回收掉的这种情况。

简单点理解的话就是,我们不使用的内存,但是并没有得到释放,这就是对内存泄漏最直白的描述。

场景

比较典型的场景就是当每一个请求进来,或者每一次处理对应的操作时,都会分配内存,但是有一块内存不能被回收或者有一块内存不能被释放,那么随着处理的请求和次数越来越多了,那么这一部分不能被回收和释放的内存占据的空间也就越来越大了,最终导致了内存泄漏的问题。
因为内存是有限的,但是请求和操作的次数是无止境的,那么被占据的内存空间越来越大了,从而导致真正用于处理请求和操作的内存越来越小了。

与内存溢出有什么关系?

内存溢出表示是内存空间不足,就比如通过一个死循环往数组中插入某个对象,虽然一个对象占据的内存空间并不大,但是如果循环的次数无止尽的增加,那么就会占据着整个内存空间,从而创建新对象的时候没有空间进行创建。
像上面这个场景,如果不能被回收释放的内存占据的空间越来越大,真正使用到的内存越来越小,那么当我们需要分配足够大的内存时就会造成内存溢出。