您的位置:首页 > 编程语言 > Java开发

java中是否存在内存泄漏,内存泄漏出现在那些情况中

2019-07-23 21:16 127 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/zmm0223/article/details/97014788

java中内存泄漏

内存泄漏:又称为“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导
致一直占据该内存单元。直到程序结束。(存储空间使用完成之后没有回收)即所谓内存泄漏。
java中存在内存泄漏,出现的原因例如:长生命周期的对象持有短生命周期的引用,短生命周期的对
象结束引用,但是长生命周期的对象仍持有其引用导致存储空间不能回收。
常见的java中内存泄漏包括以下几种:
①全局性的集合(例如:类中的静态属性,全局性的map中有静态引用或final指向它,对此没有
相应的删除机制,导致内存无法及时回收。
②不正当的单例使用也会导致内存泄漏,单例对象初始化后再JVM中(以静态的方式存在),该
单例对象对外部对象的引用,使得jvm无法对外部对象进行回收,导致内存泄露。
③类的装载器,因为类的装载器具有负载的结构,类的装载器不仅仅与常规的对象引用有关,而且与一
些静态对象以及对象内部的引用有关,这也导致了jvm无法正常回收内存。
④变量的不合理作用域,如果变量定义的范围大于其使用的范围,将会导致内存泄露。
⑤监听器,在Java语言中往往会有很多地方使用到监听器,在释放对象时可能忽略关闭监听器导致内存泄漏。

避免内存泄漏方法

①static的合理使用一般用来修饰基本数据类型或者轻量级对象,尽量避免修复集合或者大对象,常用作
修饰全局配置项、工具类方法、内部类。
②在使用静态类/匿名类的时候,尽量避免使用非静态类/匿名类,因为非静态类/匿名类含有隐式对外部
类的引用。而静态内部类/匿名类不会隐式的持有外部类引用,外部类会以正常的方式回收,如果你想在
静态内部类/匿名类中使用外部类的属性或方法时,可以显示的持有一个弱引用。
③ 各种资源连接的使用结束之后,及时的将其关闭。

java 中GC垃圾回收器处理机制

下面通过一个代码示例概述其处理机制

public Object m(){
Object o=new Float(3.14F);
Object[] oa=new Object[];
oa[0]=o;
o=null;
oa[0]=null;
print 'return 0';
}
垃圾回收处理器:当对象没有引用指向的时候,垃圾回收处理器就会默认其生命周期已经完结,并对其
进行回收操作。例如上述代码中,创建了一个float对象给o,创建数组oa,并将o赋给oa数组的0索
引,此时有两个引用指向float对象,并将o置空,紧接着将oa[0]也置空,此时已没有引用指向float对象,
此时GC会对其进行回收处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: