单词学习
heap
n.(凌乱的)一堆;许多,大量;
dump
v.丢弃,扔掉;乱堆,乱放;丢下,抛弃;分手,甩掉;倾销,抛售;转储,转存(计算机数据);(尤指系统发生故障后内存的)打印输出,卸出
n.垃圾场;废料堆场;(金矿开采作业堆积而成的)矿山废石堆;<非正式>脏地方;军需品临时存放处;转存;<美,非正式>拉屎
dump的基础概念
在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题。这些文件记录了JVM运行期间的内存占用、线程执行等情况,这就是我们常说的dump文件。常用的有heap dump和thread dump(也叫javacore,或java dump)。我们可以这么理解:heap dump记录内存信息的,thread dump是记录CPU信息的。
heap dump
heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Analyzer工具通过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。本文中使用jdk自带的工具jvisualvm分析。
如何分析.hprof文件
Distinct
adj.
不同的,有区别的;清楚的,明显的;确切的
leaks
v.
渗入,漏出;漏,渗漏;泄露,透露
n.
漏洞,裂缝;泄漏出的液体(或气体);泄密;<俚>撒尿
整个详情就是一个引用链
hook
n.
钩,挂钩;勾拳;曲线球;吸引人的东西;使(投手)下场;(尤指用于收割、剪羊毛)弧形切割工具;弯曲的笔画;弧形岬(或沙嘴)
v.
钩住,挂住;(用手臂等身体部位)箍住;钓鱼;打曲线球;弯成钩状;吸引;<非正式>偷窃;<非正式>卖淫;把……连接到(某设备)
发现内存泄露
Leaknary 能够发现内存泄露的位置有:
销毁的Activity 实例
销毁的Fragment 实例
销毁的View 实例
销毁的ViewModel 实例
Shark
n.
鲨鱼;<非正式>坑蒙拐骗的人,诈骗者;鲨尾鱼;冬夜蛾
v.
<英,非正式>(多指男子在社交场合中)努力追逐性伴侣
如何解决内存泄露
我们在代码中能不用static变量持有context就不用,非要用就用weak引用。
对于内部类,尽量用静态内部类,这样就不会持有外部类引用。如果需要外部类引用做一些事,就手动赋给一个weak引用。
对于匿名内部类,不要图简单方便,实在不行就 写成外部类
在使用handler时,记得在activity的onDestroy()中加上remove(),有待尝试
LeakCanary如何解决内存泄露以及原理解析
OOM:内存溢出
C/ C++
自己new来的对象 不使用时自己要delete
java new
jvm: GC
new
烦人的OOM
OOM其实就是申请的内存超过了堆内存剩余空间的最大值。
垃圾回收就是一种自动在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。


可达性分析
GC Root 引用:对象还不能回收
app生命周期比较长
activity生命周期比较短
activity被生命周期较长的app引用了,app又被GC Root引用了,导致activity无法被回收,导致了内存泄漏
简言之生命周期长的对象引用了生命周期短的对象,导致了内存泄漏
1.activity里使用handle要记得释放
2.通过游标去查看数据库,要做释放
LeakCanary使用
单例生命周期 > Activity
所以单例持有Activity,会导致内存泄漏
单例的生命周期 = App的生命周期
所以单例中,禁止持有Activity、Content、View
方法1:
通知 可能存在内存泄漏

看到这里可以确定,TestActivity内存泄漏了
整个页面是可达性分析的链路
如何找到原因?
从底部,沿着链路往上看
方法2:mat
LeakCanary原理分析
Thread
ActivityThread: 是不是一个线程?
相关链接
https://www.bilibili.com/video/BV1kK4y18767/?spm_id_from=333.337.search-card.all.click
网友评论