首页 》职业素养课 > JAVA面试技巧 >

Java工程师培训_java内存泄露的原因

发表日期:2019年09月25日 文章编辑:IT实战

Java判断对象是否可以回收使用的而是可达性分析算法。

在主流的商用程序语言中(Java和C#),都是使用可达性分析算法判断对象是否存活的。这个算法的基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,下图对象object5, object6, object7虽然有互相判断,但它们到GC Roots是不可达的,所以它们将会判定为是可回收对象。

java判断对象

java语言里,可作为GC roots 对象的包括如下几种:
a 虚拟机栈(栈桢中的本地变量表)中的引用的对象
b方法区中的常量引用的对象
c方法区中的常量引用的对象
d本地的方法栈中jni的引用对象
节选自《深入理解java虚拟机》

使用leakcanary检测泄漏

关于LeakCanary使用参考以下文章:
 
LeakCanary: 让内存泄露无所遁形
LeakCanary 中文使用说明
LeakCanary的内存泄露提示一般会包含三个部分:
 
第一部分(LeakSingle类的sInstance变量)
引用第二部分(LeakSingle类的mContext变量),
导致第三部分(MainActivity类的实例instance)泄露.
 



leakcanary使用注意







leakcanary和代码示例说明内存泄露

案例一:静态成员促成的内存泄露

测试内部类持有外部类引用,内部类是静态的(GC-ROOT,将一直连着这个外部类实例),静态的会和Application一个生命周期,这会导致一直持有外部类引用(内部类隐含了一个成员变量$0), 即使外部类制空= null,也无法释放。

OutterClass



TestActivity



 

案例二(单例模式引起的内存泄露)
 
DownloadManager















部分日志打印如下:当前的GC_ROOT是DownloadManager的instance实例。



山东济南华育三月Java工程师培训集训营正在招募中!  小伙伴们快点加入吧
济南华育Java工程师培训
相关新闻

济南华育学员:没有华育就没有我们的今天!

济南华育快讯:近日,刚刚就业不久的17-0910Java班学员代表李鑫铭与同学孔杰、孙磊、杨林一起来到济南华育

2018年01月05日

济南华育705网络营销班毕业啦

济南学网络营销课程 就到济南华育IT

2018年01月08日

IT行业,哪些岗位可以拿高薪

IT行业,哪些岗位可以拿高薪在职场毫无方向的时候,你可能会有这样的疑问:干哪行好呢?如果学计算机在你考虑的范围内,将来想进入软件和互

2019年09月25日

零基础如何学好大数据?

零基础如何学好大数据? 大数据是对海量数据进行存储、计算、统计、分析处理的一系列处理手段,处理的数据量通常是TB级,甚至是PB或EB级的

2019年09月24日

非计算机专业能学JAVA软件开发吗?

非计算机专业能学JAVA软件开发吗? 非计算机本专业是完全可以学的,java语言本身是很简单,不需要数学基础,甚至不需要什么计算机基础。 

2019年09月23日

2019,跳槽转行适合学习什么技术?

2019,跳槽转行适合学习什么技术?  近年来,随着信息技术的发展,阿里巴巴、百度、腾讯等IT企业如雨后春笋,拔地而起,马云、李彦宏、马

2019年09月21日

热点推荐