App性能优化--- 启动优化,内存优化

App性能优化--- 启动优化,内存优化

      启动App流程

        ​​​​​​​

note:

1.Zygote进程创建,初始化Android Runtime环境,注册JNI,执行zygoteInit.main()方法,创建Socket,Fork出System_Server进程,循环等待

2.SystemServer.run()方法执行,创建引导服务(AMS),核心服务,其他服务等,循环等待

3.启动App,ATMS通知AMS创建进程,AMS通过Socket告诉Zygote去Fork进程,然后反射执行ActivityThread.main()

4.反射创建Application,执行performLaunchActivity反射创建Activity实例对象,执行onCreate

 

  • 启动耗时检测方式 

    • 可以过滤display来过滤
    • 命令行启动App打印: adb shell am start -S -W package/classname

    • 通过在Application中 Debug.startMethodTracing 到第一个Activity的onWindowFocusChanged中 Debug.stopMethodTracing,生成trace图表

    • traceView被CPU Profile替代了 

    • Trace.beginTrace

    • systrace使用(一般看滑动卡顿):安装python工具,切换Android SDK下面的platfrom-tools目录,执行命令python systrace.py -t(记录几秒) -o(输出的报告路径)/Users/xxxx/Desktop (配置可选择)gfx(Graphics 图形系统) input(Input输入) view(View绘制系统) am(ActivityManager调用的相关信息) dalvik(虚拟机相关信息) sched(CPU调度的信息) disk(IO信息) wm(WindowManager信息) res(资源) -a(指定应用包名)

    • 生成的html文件可能会很大,可以用chrome浏览器,在地址栏中输入chrome:tracing,然后点击load加载html文件 

    • 产生D状态的原因出现uninterruptible sleep状态的进程一般是因为在等待IO,例如磁盘IO、网络IO等

    • 合理使用异步初始化,延迟初始化,懒加载机制,避免耗时操作(IO/数据库等)

    • 类加载优化:提前异步加载

    • IdleHandler进行延迟初始化:在CPU空闲时使用IdleHandler

    • 简化布局(布局通过xml解析反射生出)

  • 内存检测

    • 对象的生命周期
      • 创建 - 使用 - 不可见 - 不可达 - 搜集 - 终结 - 重新分配
      • GcRoots:静态变量,常量,线程栈变量,Jni指针
    • 常用命令查看内存指标

      • 查看手机当前进程 :adb shell ps | grep packagename (查看指定包名pid)
      • 查看App内存限制: adb shell cat /system/build.prop
      • 查看手机内存信息:adb shell cat /proc/meminfo
      • 查看当前进行的OOM_abj的值:adb shell cat /proc/pid(进程pid)/oom_adj (oom_adj 值越大,越容易被系统回收) 需要root手机查可以查看 
      • 查看整体(当前)内存情况:adb shell dumpsys meminfo /(--package 包名 ),查看进程的oom_adj,dalvik/native等区域内存情况,或者某一个进程或者apk的内存情况 
      • 查看进程的内存指标:adb shell procrank

        • USS ->进程独占的物理内存 
        • PSS ->USS+按比例包含共享库
        • RSS ->USS+包含共享库
        • VSS ->RSS+未分配实际物理内存
      • 查看系统可用内存:adb shell free

      • 查看进程的虚拟地址空间分配:adb shell showmap

      • 周期性打印进程运行队列,系统切换,cpu占用比:adb shell vmstat

    • MAT工具使用

      • 1.代码中执行Debug.dumpHprofData(path)来记录当前内存,对应目录下生成hprof文件
      • 2.通过hprof-conv (文件名称)dump.hprof(文件名称)converted-dump.hprof
        • 默认执行代码生成的hprof文件是无法通过MAT打开的
        • 需要切换到Android/SDK/platform-tools/ 下执行命令进行转换
        • Shallow Heap 浅堆(对象自己), Retained Heap 深堆(对象自己+直接引用和间接引用)
        • Listobjects -> with incoming references:查看这个对象被哪些外部对象引用;
        • Listobjects -> with outcoming references:查看这个对象持有哪些外部对象引用;
      • 视图说明 转载 
      • MAT工具使用 - 程序员大本营
      • https://www.jianshu.com/p/4e003343b6b8
        • Overview视图
          • Unreachable Objects Histogram:该视图会首页总结出当前这个Heap dump占用了多大的内存,其中涉及的类有多少,对象有多少,类加载器,可以直接点击链接
          • Biggest Objects by Retained Size:会列举出Retained Size值最大的几个值,你可以将鼠标放到饼图中的扇叶上,可以在右侧看出详细信息
        • Histogram视图 
          • histogram视图主要是查看某个类的实例个数,比如我们在检查内存泄漏时候,要判断是否频繁创建了对象,就可以来看对象的个数来看。也可以通过排序看出占用内存大的对象, 可以选择查看的方式
        • Dominator Tree视图
          • 该视图会以占用总内存的百分比来列举所有实例对象,注意这个地方是对象而不是类了,这个视图是用来发现大内存对象的。这些对象都可以展开查看更详细的信息,可以看到该对象内部包含的对象:
        • Leak Suspects:这个视图会展示一些可能的内存泄漏的点
    • Logcat检查内存泄露

      • GC_CONCURRENT:当堆变得太大,以防止溢出时调用
      • GC_FOR_MALLOC:调用时GC_CONCURENT时间没有运行,应用程序必须分配更多的内存
      • GC_EXTERNAL_ALLOC:用于蜂窝前进行外部释放分配的内存。在蜂窝和更高没有外部分配
      • GC_EXPLICIT:System.gc调用时调用 
    • 内存抖动:内存波形呈现锯齿状态,GC频繁调用导致卡顿,可以在CPU profile上查看

    • 内存泄露:不在使用的对象被GCRoots引用,导致不能回收,让可用内存变小

    • 内存溢出:手机为每个应用分配了固定大小的内存,当超过这个值就产生OOM




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值