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会对其进行回收处理。
相关文章推荐
- JAVA中是否存在内存泄漏
- [华为面试题_ND2]运行错误请检查是否存在数组越界非法访问_野指针乱访问_空指针乱访问等情况_java_scanner_error
- java中是否会存在内存泄漏
- 字典树-大量字符串前缀及出现次数是否存在统计(Trie树-java)算法实现
- java是否存在内存泄漏
- Java语言中是否存在内存泄漏的问题
- Java内存机制和是否会有内存泄漏什么情况下会泄漏
- 内存监控方法之——Jmap结合Memory Analyzer,分析java程序是否存在内存泄漏
- "每日一道面试题".net托管堆是否会存在内存泄漏的情况
- java web,charset编码设置正确情况下出现部分中文正常,部分中文乱码的问题
- Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)
- java中会存在内存泄漏吗,请简单描述。
- 【java项目实践】具体解释Ajax工作原理以及实现异步验证username是否存在+源代码下载(java版)
- java服务器检查url是否存在
- Java-基础 文件操作IO 检测文件是否存在
- Java高并发的情况下如果出现共享变量,如何保证线程安全的解决方案
- Java中出现阻塞的情况
- Java中会存在内存泄漏吗
- 解决建站时或在VS.NET中浏览网页时出现"无法在***已经存在的情况下创建,影像复制该文件"的错误
- java判定数组或集合是否存在某个元素