杭州华育LOGO

学员作品 学员心得技术园地 潮人地 Android(安卓)培训 杭州电脑(计算机)培训 杭州网络营销培训 杭州JAVA培训
返回首页
当前位置: 主页 > 学员天地 > 技术园地 >

java内存泄露的原因原来是这个

时间:2017-12-28 16:15来源:未知 作者:杭州华育 点击:
案例一: Java判断对象是否可以回收使用的而是可达性分析算法。 在主流的商用程序语言中(Java和C#),都是使用可达性分析算法判断对象是否存活的。这个算法的基本思路就是通过一系列名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称

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实例。



关于上面两种方式导致的内存泄露问题,这里再举两个案例说明以加强理解。
关于案例3和案例4明天继续更新。文章部分节选摘抄。
 
(责任编辑:杭州华育 ;杭州java培训,网络营销培训,杭州计算机培训,it培训,详询客服报名咨询
分享到:
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
提交报名信息

2018年杭州将加大力度经济转型,吸纳更多的技术人才落户杭州,软件人才需求量更是大幅提升,针对目前杭州IT行业人才需求“井喷”现象,华育软件杭州实训基地与杭州155家IT名企合作,建立人才培养与输送关系,启动“Eduask国家高端IT紧缺人才培养工程”。4月针对杭州地区18-28岁大中专生待业青年发放68个技能实训名额(应届大中专毕业生优先),经短期专业岗前实训后推荐进入企业,起薪4500-8000元,五险一金。

姓名: * 性别:
学历: 电话: *
所在地: *
您目前状况:
留言:
*