什么是内存泄漏
对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着。
内存泄漏原因
- 全局集合。(周期性清除作业)
- 特别注意事件监听和回调函数。不用的时候,要释放掉。
- 通常一些成员变量引用其他对象,初始化的时候需要置空。
- 缓存。(使用java.lang.ref.SoftReference类坚持将对象放入缓存。这个方法可以保证当虚拟机用完内存或者需要更多堆的时候,可以释放这些对象的引用。)
- 当集合里面的对象属性被修改后,再调用remove()方法时不起作用。
- 各种连接。(数据库连接,网络连接,IO连接),除非调用其close() 将其连接关闭,否则是不会自动被GC回收的。
- 内部类和外部模块等的引用。
- 不正确的单例模式。即:如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露。
SoftReference & WeakReference
如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存.
弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
网友评论