美文网首页
Android 内存性能 Profiler、MAT

Android 内存性能 Profiler、MAT

作者: WaterYuan | 来源:发表于2019-06-01 00:16 被阅读0次

    Profiler、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对象

    性能分析工具Profiler中Record/Stop

    profile查看内存抖动.PNG

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

    new了一个StringBuilder.PNG

    内存泄漏

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

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

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

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

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

    性能分析工具Profiler中的Dump

    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的最短引用
    排除所有的虚弱软引用

    Main2Activity泄漏的原因是.PNG

    MAT比Menmery Monitor更强大
    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

    相关文章

      网友评论

          本文标题:Android 内存性能 Profiler、MAT

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