Java内存泄露
一、概述 虽然Java有垃圾收集器帮助实现内存自动管理,虽然GC有效的处理了大部分内存,但是并不能完全保证内存的不泄露。 二、内存泄露 内存泄露就是堆内存中不再使用的对象,但是垃圾回收期无法从内存中删除他们的情况,因此他们会被不必要的一直存在。,这种情况会耗尽内存资源并降低系统性能,最终以OOM终止。 垃圾回收器会定期删除未引用的对象,但它永远不会收集那些仍在引用的对象。 内存泄露的症状: 应用程序长时间连续运行时性能严重下降; 应用程序中的OutOfMemoryError堆错误; 自发且奇怪的应用程序崩溃; 应用程序偶尔会耗尽连接对象。 三、Java中内存泄露类型 1、static字段引起的内存泄露 大量使用static字段会潜在的导致内存泄露,在Java中,静态字段通常拥有与整个应用程序相匹配的生命周期。 解决办法:最大限度的减少静态变量的使用;单例模式时,依赖于延迟加载对象而不是立即加载方式。 2、未关闭的资源导致内存泄露 每当创建连接或者打开流时,JVM都会为这些资源分配内存。如果没有关闭连接,会导致持续占有内存。在任意情况下,资源留下的开放连接都会消耗内存,如果我们不处理,就会降低性能,甚至OOM。 解决办法:使用finally块关闭资源;关闭资源的代码,不应该有异常;jdk1.7后,可以使用try-with-resource块。 3、不正确的equals(