Java内存泄漏引发的缘由:程序员
内存泄漏是指无用对象(再也不使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而形成内存空间的浪费称为内存泄漏。数据库
长生命周期的对象持有短生命周期对象的引用就极可能发生内存泄漏,尽管短生命周期对象已经再也不须要,可是由于长生命周期持有它的引用而致使不能被回收,这就是Java中内存泄漏的发生场景。网络
形成内存泄漏的几种状况:socket
一、静态集合类引发内存泄漏对象
像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的全部的对象Object也不能被释放,由于他们也将一直被Vector等引用着。生命周期
二、当集合里面的对象属性被修改后,再调用remove()方法时不起做用。内存
三、监听器rem
在释放对象的时候却没有去删除这些监听器,增长了内存泄漏的机会。get
四、各类链接io
好比数据库链接(dataSourse.getConnection()),网络链接(socket)和io链接,除非其显式的调用了其close()方法将其链接关闭,不然是不会自动被GC 回收的。
五、内部类和外部模块的引用
内部类的引用是比较容易遗忘的一种,并且一旦没释放可能致使一系列的后继类对象没有释放。此外程序员还要当心外部模块不经意的引用,例如程序员A 负责A 模块,调用了B 模块的一个方法如: public void registerMsg(Object b); 这种调用就要很是当心了,传入了一个对象,极可能模块B就保持了对该对象的引用,这时候就须要注意模块B 是否提供相应的操做去除引用。
六、单例模式
不正确使用单例模式是引发内存泄漏的一个常见问题,单例对象在初始化后将在JVM的整个生命周期中存在(以静态变量的方式),若是单例对象持有外部的引用,那么这个对象将不能被JVM正常回收,致使内存泄漏。