内存泄漏简单地说就是不再会被使用的对象的内存不能被回收。 对象都是有生命周期的,有的长,比如老年代的对象,有的短,比如新生代的对象。如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。 1.静态的容器,如HashMap、ArrayList,静态容器中保有着其他无用对象的引用,会导致无用对象无法被回收,而静态的容器的生命周期是与进程生命周期一致的。 比如 HashMap.put(Key, Object);而这个Object值却是null的话,会造成Object无法被回收。 2.各种提供close()方法的对象 比如Hibernate。我们操作数据库时,通过SessionFactory获取一个session。 Session session=sessionFactory.openSession();  完成后我们必须调用close()方法关闭:session.close(); SessionFactory就是一个长生命周期的对象,而session相对是个短生命周期的对象,但是框架这么设计是合理的:它并不清楚我们要使用session到多久,于是只能提供一个方法让我们自己决定何时不再使用。如果没有调用close()方法,资源连接是不会被GC垃圾回收器回收的。 3.单例模式导致内存泄漏 因为单例模式static的对象是存放在方法区中的。不会被回收。jdk1.8之后存到了元空间。并且,这个static对象具有JVM的整个生命周期,是一个长生命周期的对象,如果引用短生命周期的对象,很可能会导致内存泄漏 4.内部类和外部模块的引用  其实原理依然是一样的,只是出现的方式不一样而已。 5.容器如HashSet中修改了其中的值,因为HashSet内部是封装了HashMap的,所以当对HashSet中的元素进行修改时,会改变该元素的HashCode,也就是说会改变该元素在HashMap中的存放位置,但是由于没有改变在HashSet中的存放位置,因此使用remove()方法都无法进行移除,这就会造成内存泄漏 解决办法是重写hashcode()和equals()方法 而造成内存泄漏,我们可以对其进行排查。 1.使用虚拟机进程状况工具jps,确定频繁Full GC现象 2.使用jmap,找出导致频繁Full GC的原因 3.使用MAT查看,定位到代码,