zoukankan      html  css  js  c++  java
  • Android开发Eclipse中DDMS中Heap使用及GC_EXTERNAL_ALLOC含义

    一、先说DDMS中的Heap的使用,通过可以观察VM中的Java内存,但是无法查看通过JNI分配的内存。

    直接上图,废话少说。。。

    图一:将要查看内存使用情况的项目Update heap

    图二:操作项目,通过图表可以很直观查看虚拟机的使用内存

     

    二:Android中GC_EXTERNAL_ALLOC的含义(转)

    以下内容直接Ctrl C===》Ctrl V

    问:

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

     

    自问自答:

    前面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。

     

    总结:通过Heap可以查看到Java使用内存情况,但是无法查看JNI使用内存的情况,所以遇到内存溢出时,项目要是调用到动态库的,就留意一下通过JNI申请的内存是否合理释放。

  • 相关阅读:
    C语言中static修饰符的意义
    网络字节序
    socket接口详解
    Python实现常见算法[3]——汉罗塔递归
    Python实现常见算法[2]——快速排序
    Python实现常见算法[1]——冒泡排序
    关于钛星设备主动推送报文的解析
    2015自我提升计划
    python 基础(函数 命名空间和作用域,嵌套和作用域链,闭包)
    python 基础(文件操作,注册,以及函数)
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6469737.html
Copyright © 2011-2022 走看看