GC_EXTERNAL_ALLOC

本文详细解析了Dalvik虚拟机中的内存管理机制,特别是Java堆内存与Native内存的分配和回收过程。通过实例说明了当Native内存不足时,即使Java堆内存有剩余也无法借用的情况,从而帮助开发者理解如何避免出现内存溢出错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

09-28 17:16:37.543: DEBUG/dalvikvm(21466): GC_EXTERNAL_ALLOC freed 390 objects / 45656 bytes in 50ms
09-28 17:16:40.513: DEBUG/dalvikvm(3267): GC_EXPLICIT freed 4501 objects / 251624 bytes in 67ms

很多做开发的朋友不明白上面这句是什么意思,给大家解释一下! 

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

### 关于 `pci_alloc_consistent` 和 `dma_alloc_coherent` 的使用场景及差异 #### 函数定义与作用范围 `pci_alloc_consistent` 是专为 PCI 设备设计的一个宏,用于分配 DMA 一致性的内存区域。该函数实际上是一个封装器,内部调用了更通用的 `dma_alloc_coherent` 函数[^3]。 ```c static inline void * pci_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle) { return dma_alloc_coherent(hwdev == NULL ? NULL : &hwdev->dev, size, dma_handle, GFP_ATOMIC); } ``` 这意味着对于 PCI 设备而言,可以直接利用此接口而无需关心底层细节。而对于非 PCI 类型的设备,则应直接使用 `dma_alloc_coherent` 接口来完成类似的资源分配操作[^1]。 #### 内存特性对比 当通过上述任一方式获得一块 DMA 缓冲区时,这块内存具有特定属性: - **一致性**:所分配出来的物理页面在整个系统的视角下保持缓存的一致性; - **可访问性**:既能在 CPU 上执行读写动作,也能被指定的硬件组件(如网卡、声卡等外设)作为传输目标或源地址进行DMA操作; 值得注意的是,尽管两者最终实现的功能相似——即创建一段可供CPU和外部设备共享的数据交换空间——但在具体应用场景中有细微差别[^4]。 #### 应用实例说明 考虑到某些特殊情况下可能涉及到用户态程序对这段共享内存的需求,比如需要将来自PCI子端上的数据映射至进程地址空间供应用层处理的情形。此时便会出现 `pci_alloc_consistent` 结合 mmap 使用的情况。由于显卡通常扮演着主机角色而非从属地位,所以在标准 Linux 发行版中的确较少见到此类组合的实际案例。 然而,在一些定制化开发环境中,特别是针对嵌入式系统或是高性能计算领域内的项目来说,这样的搭配仍然具备一定的实用价值。例如在一个基于龙芯架构下的实验平台上成功实现了这一机制并验证了其可行性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值