首先Java中是存在内存泄露的,长生命周期的对象持有短生命周期对象的引用就可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用,会导致短生命周期对象不能被回收。
常见的内存泄露情形:
1使用静态的集合类
静态的集合类的生命周期和应用程序的生命周期一样长,所以在程序结束前容器中的对象不能被释放,会造成内存泄露。(不需要容器时将其赋值为null)
2 单例模式可能会造成内存泄露
单例模式只允许应用程序存在一个实例对象,并且这个实例对象的生命周期和应用程序的生命周期一样长,如果单例对象中拥有另一个对象的引用的话,这个被引用的对象就不能被及时回收。(使用弱引用)
3 变量不合理的作用域
如果变量的定义范围大于使用范围,并且在使用完后没有赋值为null的话,会出现内存泄露。定义变量的时候,能定义为局部变量就不要定义为成员变量,或者定义为成员变量的话,在使用完变量后,把变量赋值为null。4
4 数据库、网络、输入输出流,这些资源没有显示的关闭
垃圾回收只负责内存回收,如果对象正在使用资源的话,Java虚拟机不能判断这些对象是不是正在进行操作,比如输入输出,也就不能回收这些对象占用的内存,所以在资源使用完后要调用close()方法关闭。
参考链接:
http://blog.csdn.net/renfufei/article/details/14138099
http://www.2cto.com/kf/201605/506042.html
http://www.zhihu.com/question/29265003
http://blog.csdn.net/seelye/article/details/8269705