android定位优化,android内存泄漏定位与优化

android内存泄漏定位与优化(java篇)

内存泄漏:我们的应用内存不在GC可以掌控之内

1 垃圾回收机制(GC)对象引用为空的时候,会被GC回收;

总结:java的内存回收机制,莫对象没有任何引用的时候,就会被回收;

2 GC回收机制的原理

(JVM虚拟机)核心判断,GcRoot是否持有该对象,计数

如图所示:

19fd60f40e92

3 GC root持有的引用有哪些?

1.java stack 中应用的对象

2 方法区中,静态引用指向的对象

3 方法区中常量引用指向对象

4 native方法中jni引用的对象

5 Thread-“活着的线程”

4 如何判断一个对象是否为垃圾对象?

这个其实是一个主观问题,并非应用存在就不是非垃圾对象

内存泄漏多了,容易导致oom,app奔溃

5 如何判断是否存在内存泄漏

1 命令模式:

adb shell dumpsys meminfo  包名

查看目前所有的对象情况,来粗略判断是否有内存溢出

如图所示:

19fd60f40e92

点击事件发生前的activity数目

点击事件发生后的activity数目变化

19fd60f40e92

结论:activity数据持续增加,页面却没有明显的体现,存在内存溢出的情况

2.工具使用定位问题所在:

备注:IDE 目前采用的是AS3.0版本

工具介绍:

Memory Profiler 是 Android Profiler 中的一个组件,可帮助您识别导致应用卡顿、冻结甚至崩溃的内存泄漏和流失。 它显示一个应用内存使用量的实时图表,让您可以捕获堆转储、强制执行垃圾回收以及跟踪内存分配。

19fd60f40e92

1.用于强制执行垃圾回收 Event 的按钮。

2.用于捕获堆转储的按钮。

3.用于记录内存分配情况的按钮。 此按钮仅在连接至运行 Android 7.1 或更低版本的设备时才会显示。

4.用于放大/缩小时间线的按钮。

5.用于跳转至实时内存数据的按钮。

6.Event 时间线,其显示 Activity 状态、用户输入 Event 和屏幕旋转 Event。

7.内存使用量时间线,其包含以下内容:

一个显示每个内存类别使用多少内存的堆叠图表,如左侧的 y 轴以及顶部的彩色键所示。虚线表示分配的对象数,如右侧的 y 轴所示。用于表示每个垃圾回收 Event 的图标。

3.showTime 实操(RAMTest)

1.如图所示:下面这段代码是存在内部类持有对象应用这种内存泄漏情况

19fd60f40e92

2.通过不断的点击触发内存泄漏条件,内存的直线上升,以及调用gc操作,也没有得到内存的释放,可以判断存在内存泄漏;

19fd60f40e92

3.点击2(捕获堆转储的按钮),收集相关堆信息;

通过上面我们可以明确的找出TestActivity的对象持有,随着点击的增加而增加,右键点击查看,jump to source,定位到具体的对象持有代码中,从而进行相关的代码优化;

19fd60f40e92

19fd60f40e92

参考资料内存查看指令:

https://blog.csdn.net/bigconvience/article/details/35553983参考资料:

https://blog.csdn.net/yangjie5250/article/details/80264517android develop 参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值