java导致内存泄漏的原因:长生命周期的对象持有短生命周期对象引用就可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是长生命周期对象持有它的引用对象而导致不能被回收。
内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,对象是可达的,其次,这些对象是无用的,即程序以后不再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为java内存泄漏,这些对象不会被GC回收,然而它却占有内存
内存泄漏的场景
1、集合类,集合类仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用。如果这个集合类是局部变量,不会造成内存泄漏,在方法栈退出后就没有引用了会被jvm正常回收。如果是全局性变量,没有删除机制,就会造成内存只增不减
2、单例模式,不正确使用单例模式,单例对象在被初始化后将在JVM的整个生命周期中存在,如果单例对象持有外部对象引用,那么这个外部对象将不能被jvm正常回收,导致内存泄漏