android--dalvik heap 浅析

系统中可以在prop中配置dalvik堆的有关设定。具体设定由如下三个属性来控制

数据在system/build.prop文件里存储

-dalvik.vm.heapstartsize            

     堆分配的初始大小,调整这个值会影响到应用的流畅性和整体ram消耗。这个值越小,系统ram消耗越慢,

但是由于初始值较小,一些较大的应用需要扩张这个堆,从而引发gc和堆调整的策略,会应用反应更慢。

相反,这个值越大系统ram消耗越快,但是程序更流畅。

-dalvik.vm.heapgrowthlimit       

     受控情况下的极限堆(仅仅针对dalvik堆,不包括native堆)大小,dvm heap是可增长的,但是正常情况下

dvm heap的大小是不会超过dalvik.vm.heapgrowthlimit的值(非正常情况下面会详细说明)。这个值控制那

些受控应用的极限堆大小,如果受控的应用dvm heap size超过该值,则将引发oom(out of memory)。

-dalvik.vm.heapsize 

    不受控情况下的极限堆大小,这个就是堆的最大值。不管它是不是受控的。这个值会影响非受控应用的dalvik

heap size。一旦dalvik heap size超过这个值,直接引发oom。


    用他们三者之间的关系做一个简单的比喻:分配dalvik heap就好像去食堂打饭,有人饭量大,要吃三碗,有人饭量小,连一碗都吃不完。如果食堂按照三碗的标准来给每个人打饭,那绝对是铺张浪费,所以食堂的策略就是先打一碗,凑合吃,不够了自己再来加,设定堆大小也是一样,先给一个合理值,凑合用,自己不够了再跟系统要。食堂毕竟是做买卖的,如果很多人明显吃不了那么多,硬是一碗接着一碗。为了制止这种不合理的现象,食堂又定了一个策略,一般人就只能吃三碗。但是如果虎背熊腰的大汉确实有需要,可以吃上五碗,超过五碗就不给了(太亏本了)。

 

开始给一碗                                            对应       dalvik.vm.heapstartsize 

一般人最多吃三碗                                 对应       dalvik.vm.heapgrowthlimit

虎背熊腰的大汉最多能吃五碗              对应       dalvik.vm.heapsize

    在android开发中,如果要使用大堆。需要在manifest中指定android:largeHeap为true。这样dvm heap最大可达dalvik.vm.heapsize。其中分配过程,可以在heap.cpp里粗略看出一些原理:

 

  1.   
  2. static void *tryMalloc(size_t size)  
  3.  
  4.     void *ptr;  
  5.   
  6.       
  7.     if (size >= gDvm.heapGrowthLimit)  
  8.         LOGW("%zd byte allocation exceeds the %zd byte maximum heap size" 
  9.              size, gDvm.heapGrowthLimit);  
  10.         ptr NULL;  
  11.         goto collect_soft_refs;  
  12.      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个 Android 应用程序的内存使用情况输出,其中: - Pss 表示应用程序的实际内存使用量; - Private Dirty 表示应用程序的私有内存使用量; - Private Clean 表示应用程序的私有干净内存使用量; - Swap 表示应用程序的交换内存使用量; - Heap Size 表示应用程序的堆内存总大小; - Heap Alloc 表示应用程序的堆内存已分配大小; - Heap Free 表示应用程序的堆内存未分配大小。 具体来说,输出结果中的各字段含义如下: - Native Heap 表示应用程序的本地堆内存使用情况,其中 Pss 表示实际内存使用量,Private 表示私有内存使用量,Private Clean 和 Private Dirty 分别表示私有干净内存和私有脏内存使用量; - Dalvik Heap 表示应用程序的 Dalvik 堆内存使用情况,其中 Pss 表示实际内存使用量,Private 表示私有内存使用量,Private Clean 和 Private Dirty 分别表示私有干净内存和私有脏内存使用量; - Dalvik Other 表示应用程序的 Dalvik 其他内存使用情况,其中 Pss 表示实际内存使用量,Private 表示私有内存使用量; - Stack、Ashmem、Gfx dev、Other dev、.so mmap、.jar mmap、.apk mmap、.ttf mmap、.dex mmap、.oat mmap、.art mmap、Other mmap、EGL mtrack、GL mtrack、Unknown 分别表示应用程序的栈内存、匿名共享内存、图形设备显存、其他设备显存、共享库内存、Java 包文件内存、安装包文件内存、字体文件内存、Dalvik 可执行文件内存、OAT 可执行文件内存、ART 可执行文件内存、其他内存、EGL 内存跟踪、GL 内存跟踪、未知内存的使用情况,其中 Pss 表示实际内存使用量,Private 和 Private Dirty 表示私有内存使用量; - TOTAL 表示应用程序的总内存使用情况,其中 Pss 表示实际内存使用量,Private 和 Private Dirty 分别表示私有内存使用量,Clean 表示干净内存使用量,Swap 表示交换内存使用量,Heap Size、Heap Alloc 和 Heap Free 分别表示堆内存总大小、已分配大小和未分配大小。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值