美文网首页
android内存泄漏定位与优化

android内存泄漏定位与优化

作者: 大地零一 | 来源:发表于2018-07-06 17:44 被阅读0次

     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 参考资料

    相关文章

      网友评论

          本文标题:android内存泄漏定位与优化

          本文链接:https://www.haomeiwen.com/subject/xtsbuftx.html