首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android上C/C++内存使用指南

Android上C/C++内存使用指南
EN

Stack Overflow用户
提问于 2012-11-05 22:55:00
回答 1查看 2.4K关注 0票数 1

在android.com上,他们说,如果你在Java中工作,你可以使用的最大内存是16MB。至少这是这些设备应该支持的功能。如果你用的是一部旧手机,你会注意到你不能得到更多,你只能得到一部OutOfMemoryError。如果您使用NDK做同样的事情,就不会。在我的应用程序中,我试图获得50MB甚至更多的内存,到目前为止,Android对此还不错。

我在android.com上没有找到任何与此相关的东西。

像Java一样也有限制吗?

如果是:限制是多少?

如果不是,那么它的价值是什么?

问题是,我必须根据这个大小构建我的代码。

编辑:我尝试了Seva的建议。

代码语言:javascript
复制
     root@android:/ # ulimit -a
     ulimit -a
     time(cpu-seconds)    unlimited
     file(blocks)         unlimited
     coredump(blocks)     0
     data(KiB)            unlimited
     stack(KiB)           8192
     lockedmem(KiB)       64
     nofiles(descriptors) 1024
     processes            7806
     flocks               unlimited
     sigpending           7806
     msgqueue(bytes)      819200
     maxnice              40
     maxrtprio            0
     resident-set(KiB)    unlimited
     address-space(KiB)   unlimited
     root@android:/ # ulimit -v
     ulimit -v
     unlimited
     root@android:/ #

我请求的内存(通过使用"alloc“或"new")是虚拟内存(ulimit -v)。所以没有机会弄清楚我能得到多少?!

EN

回答 1

Stack Overflow用户

发布于 2012-12-06 01:38:38

你会受到三种类型的内存限制:

1)为了在多任务处理时保持系统响应而设置的人为限制-- VM堆限制就是这种限制的主要示例。ulimit是一种潜在的机制,让操作系统对你提供更多的限制,但我还没有看到它在Android设备上的限制性使用。

2)基于可用实际内存的物理限制。你应该有一个正在开发/测试的基准设备,并且应该非常积极地假设其他进程(后台服务,其他应用程序)也需要内存。还要记住,操作系统使用的内存随操作系统版本的不同而不同(并且会随着时间的推移而增加)。股票Android不交换,所以如果你走得太远,你就死定了。一种可能的情况是Nexus One (512MB内存)有一个音频播放器和手机应用程序在后台运行,一个“气球”服务消耗另外100MB的物理内存以提供一些回旋余地;在这种配置中,你仍然会发现有超过100MB的可用内存。

3)基于地址空间的虚拟内存限制。普通的android允许过量使用内存,所以如果你在一个有512MB内存的设备上请求1 1GB的虚拟分配(通过mmap等),它不会闪烁,这通常是一件非常有用的事情。但是,当您随后触摸内存时,它需要被带到物理内存中。如果物理内存中有只读页面,它们可以被弹出,但很快就会用完,而且没有交换--死。(在内存不足的情况下,过度提交和无交换的组合会直接导致进程死亡,而不是像malloc返回null这样的可恢复错误)。

最后,值得注意的是,calloc/malloc/new是否需要物理分配取决于分配器,但更安全的做法是假定需要,特别是对于少于大量页面的分配。因此:如果您正在处理<100MB的标准、行为良好的分配,那么您可能是在测试中!如果您正在处理大量希望进行内存映射的数据,那么在谨慎使用时,mmap是您的好朋友,在仅与PROT_READ一起使用时,它也是您最好的朋友。如果您正在处理>100MB的物理内存分配,那么期望在现代设备上运行得相当好,但是您必须仔细定义一个基准并进行测试,因为动态检测内存不足的情况通常是不可能的。

另请注意: APP_CMD_LOW_MEMORY确实存在,是清除缓存的好地方,但不能保证及时调用它来挽救您的生命。这根本不会改变整体情况。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13234586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档