Android内存性能分析及工具

Profile、MAT 的使用(Android Studio 生成的 hprof 文件如何被 eclipse 的 MAT 分析)
https://www.jianshu.com/p/676d04243800
转载请注明出处
https://github.com/WaterYuanData/f2/tree/testMemory/testmemory

内存抖动

原因:短时间创建(GC销毁)大量 临时对象
影响:卡顿(GC阻塞主线程)
场景:循环内字符串拼接、log打印,自定义动画的onDraw()中新建对象等,
Color.parseColor内通过subString新建String对象

性能分析工具profile中Record/stop

9601136-9dff4807a332d814.PNG
profile查看内存抖动.PNG

编译成字节码
javac MyMemory.java
对代码进行反汇编
javap -c MyMemory.class
查看
循环里new了一个StringBuilder

9601136-f1dbc927d3015d05.PNG
new了一个StringBuilder.PNG

内存泄漏

该释放的没被释放,该回收的没被回收。
长生命周期对象持有短生命周期对象的强引用,从而导致短生命周期对象无法被回收。
场景:

  • 单例持有Activity的Context导致Activity无法被回收,进而导致Activity的成员也无法被回收
    单例持有Activity的成员会导致Activity无法被回收吗?
  • 自定义View若在onAttachedToWindow()中开启动画,则需要在onDetachedFromWindow()中
    ValueAnimtor.removeAllUpdateListeners();
    ValueAnimtor.cancle();

可达性分析:
被GC Roots直接或者间接引用则会导致无法被回收

非静态内部类默认持有外部类的强应用,
比如解决Handler的内存泄漏,
mHandler.removeCallbacksAndMessages(null)

常使用弱引用的原因:
软引用在非内存不足的GC时仍不能回收,故仍有内存泄漏

性能分析工具profile中的dump

9601136-3269e5b914d72d9b.PNG
Main2Activity泄漏.PNG

hprof文件的装换:
借助Sdk\platform-tools下hprof-conv命令,platform-tools在环境变量中则可直接使用
hprof-conv -z 源文件.hprof 转换生成的文件.hprof
比如 hprof-conv.exe -z a.hprof b.hprof

MAT查看强引用:
MAT的官方下载地址
怎么计算和验证文件的SHA值
MAT中Open Heap Dump 转换生成的文件.hprof
直方图
合并到GC Roots的最短引用
排除所有的虚弱软引用

9601136-37e2beb8ac72842d.PNG
Main2Activity泄漏的原因是.PNG

ps:
GC的实现:CMS垃圾回收器
使用标记-清除算法:内存碎片
GC的触发
申请GC,System.gc(),GC不一定立即执行
新生代,老年代
onAttachedToWindow(),自定义动画显示到窗口时被调用
MyEclipse官方中文网


Android 内存 - 获取单个应用内存限制

adb shell getprop | grep dalvik
[dalvik.vm.appimageformat]: [lz4]
[dalvik.vm.boot-dex2oat-threads]: [4]
[dalvik.vm.checkjni]: [false]
[dalvik.vm.dex2oat-Xms]: [64m]
[dalvik.vm.dex2oat-Xmx]: [512m]
[dalvik.vm.dex2oat-threads]: [4]
[dalvik.vm.heapgrowthlimit]: [384m]
[dalvik.vm.heapmaxfree]: [8m]
[dalvik.vm.heapminfree]: [512k]
[dalvik.vm.heapsize]: [512m]
[dalvik.vm.heapstartsize]: [8m]
[dalvik.vm.heaptargetutilization]: [0.75]
[dalvik.vm.image-dex2oat-Xms]: [64m]
[dalvik.vm.image-dex2oat-Xmx]: [64m]
[dalvik.vm.image-dex2oat-threads]: [4]
[dalvik.vm.isa.arm.features]: [default]
[dalvik.vm.isa.arm.variant]: [cortex-a15]
[dalvik.vm.isa.arm64.features]: [default]
[dalvik.vm.isa.arm64.variant]: [generic]
[dalvik.vm.stack-trace-file]: [/data/anr/traces.txt]
[dalvik.vm.usejit]: [true]
[dalvik.vm.usejitprofiles]: [true]
[persist.sys.dalvik.vm.lib.2]: [libart.so]
[ro.dalvik.vm.native.bridge]: [0]

Runtime.getRuntime().maxMemory()
long maxMemory = Runtime.getRuntime().maxMemory();
Log.i(TAG, "onCreate: " + (maxMemory / 1024 / 1024));
I/MainActivity: onCreate: 384

Android 查看每个应用的最大可用内存
dalvik.vm.heapgrowthlimit(仅仅针对dalvik堆,不包括native堆)
dalvik.vm.heapsize(如果存在heapgrowthlimit参数,则以heapgrowthlimit为准)

Android应用程序的默认最大内存值以及修改

Android——Runtime类中的freeMemory,totalMemory,maxMemory等几个方法


https://github.com/square/leakcanary

转载于:https://www.jianshu.com/p/676d04243800

猜你喜欢

转载自blog.csdn.net/weixin_33973609/article/details/91248217