java面试:内存泄漏相关知识

百度百科(https://baike.baidu.com/item/内存泄漏/6181425?fr=aladdin):内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

一般来说,内存泄漏存在两种情况:

       :如在C/C++语言中的,在堆中分配的内存,在还没有将其释放掉的时候,就把所有能访问这块内存的方式都删掉(如指针重新赋值);

       :则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。

       java通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存。理论上java中所有不被利用的对象所占有的内存,它们都会被GC回收,但事实java也存在内存泄漏,但它的表现与c++不同。

       第一种情况,在Java种有垃圾回收机制(GC)的引入,已经得到了很好的解决。所以,Java中的内存泄漏主要指的是第二种情况,而C++则包含以上两种情况。

        在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度。我们有时也将其称为“对象游离”。

        内存泄漏是造成应用程序OOM(OutOfMemory)的主要原因之一。我们知道Android系统为每个应用程序分配的内存是有限的,而当一个应用中产生的内存泄漏比较多时,这就难免会导致应用所需要的内存超过系统分配的内存限额,这就造成了内存溢出从而导致应用Crash。

       长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收。

常见的内存泄漏及解决方法:

1、不正确使用单例模式是引起内存泄露的一个常见问题,单例对象在被初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露,

2、各种连接 ,比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的。数据库连接中对于Resultset 和Statement 对象可以不进行显式回收,但Connection 一定要显式回收,因为Connection 在任何时候都无法自动回收,而Connection一旦回收,Resultset 和Statement 对象就会立即为NULL。如果使用连接池,情况就不一样了,除了要显式地关闭连接,还必须显式地关闭Resultset Statement 对象(关闭其中一个,另外一个也会关闭),否则就会造成大量的Statement 对象无法释放,从而引起内存泄漏。这种情况下一般都会在try里面去的连接,在finally里面释放连接。

3、内部类和外部模块等的引用,内部类(匿名内部类、非静态内部类)的引用是比较容易遗忘的一种,而且一旦没释放可能导致一系列的后继类对象没有释放。外部模块,比如在A模块调用了B模块的一个方法public void login(Object b){},传入了一个对象,很可能模块A就保持了对该对象的引用,这时候就需要注意模块A 是否提供相应的操作去除引用。

4、监听器 在java 编程中,我们都需要和监听器打交道,通常一个应用当中会用到很多监听器,我们会调用一个控件的诸如addXXXListener()等方法来增加监听器,但往往在释放对象的时候却没有记住去删除这些监听器,从而增加了内存泄漏的机会。

5、静态集合类 静态变量生命周期与应用生命周期一样,他们集合中所引用的对象也一直不能被释放。必须将静态集合对象内容清空,才能释放所引用的对象。

6、当集合里面的对象属性被修改后,该对象的hashcode值发生改变,再调用remove()方法时不起作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值