• Android GC


    Log代码  收藏代码
    1. 28470               dalvikvm  D  GC_FOR_MALLOC freed 665 objects / 239992 bytes in 71ms  
    2. 28470               dalvikvm  D  GC_FOR_MALLOC freed 673 objects / 240288 bytes in 87ms  
    3. 21940               dalvikvm  D  GC_EXPLICIT freed 4802 objects / 185320 bytes in 78ms  
    4. 28470               dalvikvm  D  GC_FOR_MALLOC freed 666 objects / 240536 bytes in 63ms  

    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.

    Java代码  收藏代码
    1. typedef enum {  
    2.     /* Not enough space for an "ordinary" Object to be allocated. */  
    3.     GC_FOR_MALLOC,  
    4.     /* Automatic GC triggered by exceeding a heap occupancy threshold. */  
    5.     GC_CONCURRENT,  
    6.     /* Explicit GC via Runtime.gc(), VMRuntime.gc(), or SIGUSR1. */  
    7.     GC_EXPLICIT,  
    8.     /* GC to try to reduce heap footprint to allow more non-GC'ed memory. */  
    9.     GC_EXTERNAL_ALLOC,  
    10.     /* GC to dump heap contents to a file, only used under WITH_HPROF */  
    11.     GC_HPROF_DUMP_HEAP  
    12. } GcReason;  
     

    Roughly speaking, the format is [Reason] [Amount Freed], [Heap Statistics], [External Memory Statistics], [Pause Time]

    Reason

    Robert/yuku already gave info on the meaning of these.

    Amount Freed

    E.g. freed 2125K

    Self explanatory

    Heap Statistics

    E.g. 47% free 6214K/11719K

    These numbers reflect conditions after the GC ran. The "47% free" and 6214K reflect the current heap usage. The 11719K represents the total heap size. From what I can tell, the heap can grow/shrink, so you will not necessarily have an OutOfMemoryError if you hit this limit.

    External Memory Statistics

    E.g external 7142K/8400K

    Note: This might only exist in pre-Honeycomb versions of Android (pre 3.0).

    Before Honeycomb, bitmaps are allocated external to your VM (e.g. Bitmap.createBitmap() allocates the bitmap externally and only allocates a few dozen bytes on your local heap). Other examples of external allocations are for java.nio.ByteBuffers.

    Pause Time

    If it's a concurrent GC event, there will be two times listed. One is for a pause before the GC, one is for a pause when the GC is mostly done. E.g. paused 3ms+5ms

    For non-concurrent GC events, there is only one pause time and it's typically much bigger. E.g. paused 87ms

    GC_EXTERNAL_ALLOC freed 297K, 49% free 3411K/6663K, external 24870K/26260K, paused 83ms

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

  • 相关阅读:
    利用javabean完成注册效果
    DAO设计模式例子
    SmartUpload使用和简介
    js和jquery通过this获取html标签中的属性值
    细说引用类型string StringBuilder class的特点
    WinForm控件自动提示你定义相似的项值
    利用Assembly动态加载程序集
    C# 数据结构与算法系列(五) 队列
    ASP.NET最简单的用户权限管理
    C# 数据结构与算法系列(三) 线性表之链表
  • 原文地址:https://www.cnblogs.com/olvo/p/2569960.html
Copyright © 2020-2023  润新知