android手机经常报out of memory错误。我知道每一个进程有一个用于bitmap解析的内存限制,如果解析的bitmap超过这个大小就会报错。我们如何知道这个内存值是多少,以及使用过程中剩余多少?我知道程序内部可能出现了bitmap内存泄露,所以我想通过这个办法来跟进一下,bitmap的内存是在什么地方被消耗了。

解决方案 »

  1.   

     Runtime.getRuntime().maxMemory()   ; 进程可用总的内存大小
     Runtime.getRuntime().totalMemory() ; 进程已用的内存大小
     totalMemory超过maxMemory时就会包报out of memory错误。 可以手动new byte[1024*1024*1];申请1M内存,再打印看看这两个值。
      

  2.   

    用DDMS的内存监测工具Heap 试试。
      

  3.   

    检查 Bitmap.recycle()的地方有没有异常。
      

  4.   

    我打印了一下maxMemory=16777216,totalMemory=3153888
    但是我用ddms的进程查看器,VM size 为138852,这个和totalMemory之间是怎么一样关系? 
      

  5.   

    这个ms关系不大,cat /proc/pid/status 可以看到VM size 单位是KB,是该进程的虚拟内存大小。你应用不能超过16M大小 超过了就报错了
      

  6.   

    你可以修改这个大小的,root之后修改/system/build.prop这个文件的dalvik.vm.heapsize
      

  7.   

    android 一个进程就虚拟机吧
    VM虚拟内存大小和进程占有内存大小不一样吗
      

  8.   

    VM size 是分配给虚拟机的虚拟内存空间,这个值只要比maxMemory大些就可以了
      

  9.   

    totalMemory()表示调用时刻,java虚拟机现在已经从操作系统那里获取来的内存大小。在java程序运行的过程的,内存总是慢慢的从操作系统那里取的,基本上是用多少取多少。 但是java虚拟机100%的情况下是会稍微多取一点的。嗯。android Runtime类中有freememory() 、totalmemory()、和maxmemory()等方法可以打印出信息VM内存使用量。
      

  10.   

    用 Options 解决这个问题
    http://www.qianxk.com/forum.php
      

  11.   

    你们的回答 其实 跟楼主问的 完全 没关系 ,bitmapFactory 单独的 内存如何查看呢?
      

  12.   

    我找到了一个方法 楼主 可以试一下  long allocNativeHeap = Debug.getNativeHeapAllocatedSize()/1024;