android内存泄漏定位与优化(java篇)
内存泄漏:我们的应用内存不在GC可以掌控之内
1 垃圾回收机制(GC)对象引用为空的时候,会被GC回收;
总结:java的内存回收机制,莫对象没有任何引用的时候,就会被回收;
2 GC回收机制的原理
(JVM虚拟机)核心判断,GcRoot是否持有该对象,计数
如图所示:
3 GC root持有的引用有哪些?
1.java stack 中应用的对象
2 方法区中,静态引用指向的对象
3 方法区中常量引用指向对象
4 native方法中jni引用的对象
5 Thread-“活着的线程”
4 如何判断一个对象是否为垃圾对象?
这个其实是一个主观问题,并非应用存在就不是非垃圾对象
内存泄漏多了,容易导致oom,app奔溃
5 如何判断是否存在内存泄漏
1 命令模式:
adb shell dumpsys meminfo 包名
查看目前所有的对象情况,来粗略判断是否有内存溢出
如图所示:
点击事件发生前的activity数目
点击事件发生后的activity数目变化
结论:activity数据持续增加,页面却没有明显的体现,存在内存溢出的情况
2.工具使用定位问题所在:
备注:IDE 目前采用的是AS3.0版本
工具介绍:
Memory Profiler 是 Android Profiler 中的一个组件,可帮助您识别导致应用卡顿、冻结甚至崩溃的内存泄漏和流失。 它显示一个应用内存使用量的实时图表,让您可以捕获堆转储、强制执行垃圾回收以及跟踪内存分配。
1.用于强制执行垃圾回收 Event 的按钮。
2.用于捕获堆转储的按钮。
3.用于记录内存分配情况的按钮。 此按钮仅在连接至运行 Android 7.1 或更低版本的设备时才会显示。
4.用于放大/缩小时间线的按钮。
5.用于跳转至实时内存数据的按钮。
6.Event 时间线,其显示 Activity 状态、用户输入 Event 和屏幕旋转 Event。
7.内存使用量时间线,其包含以下内容:
一个显示每个内存类别使用多少内存的堆叠图表,如左侧的 y 轴以及顶部的彩色键所示。虚线表示分配的对象数,如右侧的 y 轴所示。用于表示每个垃圾回收 Event 的图标。
3.showTime 实操(RAMTest)
1.如图所示:下面这段代码是存在内部类持有对象应用这种内存泄漏情况
2.通过不断的点击触发内存泄漏条件,内存的直线上升,以及调用gc操作,也没有得到内存的释放,可以判断存在内存泄漏;
3.点击2(捕获堆转储的按钮),收集相关堆信息;
通过上面我们可以明确的找出TestActivity的对象持有,随着点击的增加而增加,右键点击查看,jump to source,定位到具体的对象持有代码中,从而进行相关的代码优化;
参考资料内存查看指令:
https://blog.csdn.net/bigconvience/article/details/35553983参考资料:
https://blog.csdn.net/yangjie5250/article/details/80264517android develop 参考资料