• Android中GC_EXTERNAL_ALLOC的含义


    GC_FOR_MALLOC means that the GC was triggered because there wasn't enough memory left on the heap to perform an allocation. Might be triggered when new objects are being created.

    GC_EXPLICIT means that the garbage collector has been explicitly asked to collect, instead of being triggered by high water marks in the heap. Happens all over the place, but most likely when a thread is being killed or when a binder communication is taken down.

    There are a few others as well:

    GC_CONCURRENT Triggered when the heap has reached a certain amount of objects to collect.

    GC_EXTERNAL_ALLOC means that the the VM is trying to reduce the amount of memory used for collectable objects, to make room for more non-collectable.

    typedefenum
        /* Not enough space for an "ordinary" Object to be allocated. */ 
        GC_FOR_MALLOC, 
        /* Automatic GC triggered by exceeding a heap occupancy threshold. */ 
        GC_CONCURRENT, 
        /* Explicit GC via Runtime.gc(), VMRuntime.gc(), or SIGUSR1. */ 
        GC_EXPLICIT, 
        /* GC to try to reduce heap footprint to allow more non-GC'ed memory. */ 
        GC_EXTERNAL_ALLOC, 
        /* GC to dump heap contents to a file, only used under WITH_HPROF */ 
        GC_HPROF_DUMP_HEAP 
    }GcReason

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

     释放了297K,现在Free的内存是49%,已用的内存是3411,总得内存是6663

    自问自答:

    前面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申请的内存是否合理释放。

    //转自:

    http://jcwlw.blog.163.com/blog/static/36773209201111239364514/

  • 相关阅读:
    sql server 镜像操作
    微信测试公众号的创见以及菜单创建
    linux安装redis步骤
    Mysql 查询表字段数量
    linux 链接mysql并覆盖数据
    linux (centos)增删改查用户命令
    CentOS修改用户密码方法
    https原理及其中所包含的对称加密、非对称加密、数字证书、数字签名
    com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. 问题解决方法
    设计模式(三):模板方法模式
  • 原文地址:https://www.cnblogs.com/PLifeCopyDown/p/3291795.html
Copyright © 2020-2023  润新知