GC_EXTERNAL_ALLOC freed 297K, 49% free 3411K/6663K, external 24870K/26260K, paused 83ms
这里边的每个数字都是什么意思阿?
free 3411K/6663K和external 24870K/26260K,分别都是表示什么的阿?

解决方案 »

  1.   

    前边这段的意思应该是:释放了297K,现在Free的内存是49%,已用的内存是3411,总得内存是6663.
    关键是不理解后边的external 24870K/26260K是什么意思?
      

  2.   

    数据的缓存??
    我得到的一种解释是:这个进程除开虚拟机使用的内存~
    因为Android中一个进程分配的内存应该是16、24或32M。
    我们这个是32M。前面的6663K是VM开销使用到的内存,24870K/26260K应该是其他开销使用的内存,例如C等。
      

  3.   

    现在是基本上搞明白了~
    前面Free的内存是VM中java使用的内存,external是指VM中通过JNI中Native的类中的malloc分配出的内存,例如Bitmap和一些Cursor都是这么分配的。
    在Davilk中,给一个程序分配的内存根据机型厂商的不同,而不同,现在的大部分的是32M了,而在VM内部会把这些内存分成java使用的内存和 Native使用的内存,它们之间是不能共享的,就是说当你的Native内存用完了,现在Java又有空闲的内存,这时Native会重新像VM申请,而不是直接使用java的。
    例如上边的例子
    free 3411K/6663K和external 24870K/26260K
    如果这时需要创建一个2M的Bitmap,Native现有内存26260-24870=1390K<2048k,因此他就会向Vm申请内存,虽然java空闲的内存是
    6663-3411=3252>2048,但这部分内存Native是不能使用。
    但是你现在去申请2M的Native内存,VM会告诉你无法分配的,因为现在已使用的内存已经接近峰值了32M(26260+6663=32923 ),所以现在就会成force close 报OOM。
    所以现在我们要检查我们的native内存的使用情况来避免OOM。
      

  4.   

    楼主明白人 怎么控制native内存?为什么malloc内存一直涨?搞定否?听说debug模式下,缓存的bitmap会越来越多,不会自动清理。