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的内存是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。
转至:http://hi.baidu.com/qmiao128/blog/item/69f2fa31d4a5d3b05fdf0ed2.html
分享到:
相关推荐
GC_BEFORE_OOM : GC_FOR_MALLOC; // 实际的GC操作逻辑... } ``` 此函数接收一个布尔参数`clearSoftReferences`,决定是否清除软引用指向的对象。根据该参数的不同,选择合适的`GcSpec`实例,并执行相应的GC操作。...
* GC_FOR_MALLOC: 当应用程序需要分配更多内存,可是现有内存已经不足的时候,系统会进行GC操作来释放内存。 * GC_HPROF_DUMP_HEAP: 当生成HPROF文件的时候,系统会进行GC操作。 * GC_EXPLICIT: 这种情况就是我们...
1. **GC_FOR_MALLOC**:当试图分配新对象但内存不足时,会触发这种类型的GC。它主要针对应用程序堆(Active Heap)进行垃圾回收。 2. **GC_CONCURRENT**:当堆内存占用达到阈值时,系统会自动进行并发GC。这种GC...
迷你垃圾回收器(Mini GC for C)是一种针对C语言实现的轻量级内存管理工具,主要功能是自动回收不再使用的内存,以防止内存泄漏。在C语言中,程序员需要手动管理内存分配和释放,而垃圾回收器则可以自动化这一过程...
11-23 09:44:56.947: D/dalvikvm(1585): GC_FOR_MALLOC freed 3278 objects / 311568 bytes in 31ms rejecting opcode 0x21 at 0x000a rejected Lorg/apache/log4j/config/PropertySetter;.getPropertyDescriptor ...
它允许用户使用类似于标准malloc和realloc函数的函数来分配内存,而不必担心丢失引用和内存泄漏。 GarbageCollector可以识别用户代码无法再访问的所有内存块,并对其进行重新分配。 这样做时,如果可执行文件在...
for (int j = i + 1 ; j ; j++) { if (array[j] ) { temp = array ; array = array[j] ; array[j] = temp ; } } } 9.描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:不是。可以用任意...
题目中提到了`goto`和`malloc`,这两个不是Java的关键字。`extends`是Java中的关键字,用于表示类的继承关系。`FALSE`不是一个Java关键字,正确的布尔常量是`false`。Java的关键字包括但不限于`abstract`, `assert`,...
C语言没有内置的垃圾收集机制,程序员需要手动管理内存,使用`malloc()`和`free()`等函数分配和释放内存。 9. **其他C语言基础**: - 数据类型:C语言有基本类型(如int、char、float等)、结构体、枚举等。 - ...
4. **流程控制语句**:包括条件语句(if-else,switch-case)、循环语句(for,while,do-while)以及跳转语句(break,continue)。这些语句用于控制程序的执行顺序。 5. **函数**:函数是C语言中的可重用代码块,...
- **GC算法**:包括标记-清除、复制、标记-整理等算法。 - **垃圾回收器**:如Serial、ParNew、Parallel Scavenge等。 - **分代收集理论**:将内存划分为新生代和老年代,采用不同的回收策略。 #### 序列化 - **...
3. 控制结构:包括顺序结构、选择结构(if...else、switch...case)和循环结构(for、while、do...while)。 4. 函数:理解函数的定义、调用、参数传递,以及递归函数的使用。 5. 数组与指针:了解数组的声明、...