zoukankan      html  css  js  c++  java
  • Android内存tips

    1. Android应用程序的默认最大内存值为16M,如何修改Android应用程序的默认最大内存值?

    修改或添加/system/build.prop中的配置项:

    root@NX551J:/system # cat build.prop | grep 'dalvik.vm'
    cat build.prop | grep 'dalvik.vm'
    dalvik.vm.heapminfree=4m
    dalvik.vm.heapstartsize=16m
    dalvik.vm.heapgrowthlimit=256m
    dalvik.vm.heapsize=512m
    dalvik.vm.heaptargetutilization=0.75
    dalvik.vm.heapmaxfree=8m

    2. 查看当前进程内存使用情况:

    dumpsys meminfo <package_name> or <pid>

    dumpsys meminfo 'cn.txh.demo'
    Applications Memory Usage (kB):
    Uptime: 372832186 Realtime: 504869683

    ** MEMINFO in pid 15655 [cn.nubia.photoeditor] **
    Pss Private Private Swapped Heap Heap Heap
    Total Dirty Clean Dirty Size Alloc Free
    ------ ------ ------ ------ ------ ------ ------
    Native Heap 6568 6036 0 0 12288 10331 1956 (进程原生内存堆使用详情)
    Dalvik Heap 80643 80148 0 0 82572 76595 5977 (进程GC内存堆使用详情)

    3. GC

    Java虚拟机在运行Java程序的过程中,可以自动回收不再使用的对象实例;

    GC线程运行时会中断主线程,若中断时间过长,可能出现ANR。

    常见的垃圾回收算法:

    引用计数法(Reference Counting), 标注并清理(Mark and Sweep), 拷贝(Copying), 逐代回收(Generational).

    Android采用的是标注并清理,以及拷贝GC。

    Logcat中的GC信息:

    格式[GC的原因][回收的内存总量],[GC堆内存的统计信息],[外部内存的统计信息],[中断时间]

    例:

    D/dalvikvm( 823):GC_FOR_MALLOC freed 2732k, 26% free 18834k/25287k, paused 1302ms
    D/dalvikvm( 823):GC_CONCURRENT freed 7k, 15% free 21564k/25287k, paused 38ms+335ms
    D/dalvikvm( 397):GC_EXPLICIT freed 223 objects / 12976 bytes in 9ms

    GC的原因:

    (1) GC_FOR_MALLOC:

    表示内存垃圾回收过程是因为在分配内存空间(如创建对象)时,内存不够而引发的;

    (2) GC_EXPLICIT:

    表示GC是被显示请求触发的,如通过System.gc调用、一个Java线程被杀死或Binder通信中断等引起的;

    (3) GC_CONCURRENT:

    表明GC是在内存使用率达到一定的警戒线时,自动触发的;

    (4) GC_BEFORE_OOM:

    表明在虚拟机抛出内存不够异常(OOM)之前,执行最后一次回收内存垃圾;

    外部内存的统计信息:是原生(C/C++)内存堆的使用情况,对于Android3.0以前的版本,Android应用中的所有的位图都是分配在C/C++内存堆上

    的,在Java的GC内存堆上只有一小块内存用于描述其信息。这种内存分配方法使得位图导致的内存泄漏很难被发现和跟踪,因此在3.0以后的版

    本,位图也分配在了Java的GC内存堆上了。

    4. 调查内存泄漏工具

    Shallow size: 指对象本身占用的内存空间大小,而不考虑被其引用到的内存总量;

    Retained size:指对象的Shallow size加上从其开始所能访问到的所有对象的Shallow size之和。

                             换句话说,Retained size是该对象被GC之后所能回收到内存的总和

    如果内存使用率一直增长,GC内存堆大小也一直增长,基本可以断定应用存在内存泄漏;

    使用DDMS中dump HPROF file保存GC内存堆。

    使用Eclipse MAT(Memory Analysis Toolkit 内存分析工具)和jHat(Java Heap Analysis Toolkit, Java堆分析工具)分析。

    MAT只能分析符合标准JVM规范的HPROF文件。

    Android SDK专门提供了一个工具"hprof-conv"将Android系统生成的HPROF文件转换成MAT可分析的格式。

    例:hprof-conv xxx.hprof xxx.conv.hprof

    5. 避免内存泄漏:

    (1)  注册了监听,不用时取消监听

    (2)  使用弱引用,在横竖屏切换时回收;(弱引用:不能将对象强制留在内存中)

  • 相关阅读:
    php header 跳转 ie问题
    Filter过滤不了Action的问题
    DB2中sql语句占位符问题
    LL(1)文法
    算法分析实验报告词法分析器
    大数据概述
    2016.9.30 编译原理词法分析器
    131有确定性的有穷自动机
    Python基础综合练习
    组合数据类型练习
  • 原文地址:https://www.cnblogs.com/nicoleTeng/p/7411254.html
Copyright © 2011-2022 走看看