首页 > 编程知识 正文

java内存泄漏的原因及解决办法,java什么情况会造成内存泄漏

时间:2023-05-04 21:25:43 阅读:195329 作者:3434

JAVA中的内存溢出和内存泄漏分别是什么,有什么联系和区别,我谈谈自己的理解。

内存泄漏(memory leak ):申请了内存不释放,比如100m的内存,分配了10m的内存一直不回收,那么可以用的内存只有90m了,仿佛泄露掉了一部分;通俗一点讲的话就是【占着茅坑不拉shi】。

内存溢出(out of memory):申请内存时,没有足够的内存可以使用;通俗一点儿讲,一个厕所就三个坑,有两个站着茅坑不走的,剩下最后一个表示压力很大,这时候一下子来了两个人,坑位(内存)就不够了。

内存泄漏和内存溢出的关系:内存泄露的增多,最终会导致内存溢出。

这是一个很有味道的例子......

如上图,对象X引用对象Y,X的生命周期为60,Y的生命周期为20,当Y生命周期结束的时候,X依然引用着B,这时候,垃圾回收期是不会回收对象Y的;如果对象X还引用着生命周期比较短的A、B、C...对象A又引用着对象a、b、c...

那么就可能造成大量无用的对象不能被回收,进而占据了内存资源,造成内存泄漏,直到内存溢出。

内存泄漏的分类

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

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

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

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

内存泄露产生的可能原因

循环过多或死循环,产生大量对象;

静态集合类引起内存泄漏,因为静态集合的生命周期和应用一致,所以静态集合引用的对象不能被释放;

单例模式,和静态集合导致内存泄露的原因类似;

事件监听(listeners)和回调(callbacks);

各种连接,比如数据库连接、Socket连接、IO等,必须显式释放(close);

内存中加载数据量过大;我之前项目有一次上线的时候,应用启动奇慢直到夯死,就是因为代码中会加载一个表中的数据到缓存(内存)中,测试环境只有几百条数据,但是生产环境有几百万的数据。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。