在android.com上,他们说,如果你在Java中工作,你可以使用的最大内存是16MB。至少这是这些设备应该支持的功能。如果你用的是一部旧手机,你会注意到你不能得到更多,你只能得到一部OutOfMemoryError。如果您使用NDK做同样的事情,就不会。在我的应用程序中,我试图获得50MB甚至更多的内存,到目前为止,Android对此还不错。
我在android.com上没有找到任何与此相关的东西。
像Java一样也有限制吗?
如果是:限制是多少?
如果不是,那么它的价值是什么?
问题是,我必须根据这个大小构建我的代码。
编辑:我尝试了Seva的建议。
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)。所以没有机会弄清楚我能得到多少?!
发布于 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确实存在,是清除缓存的好地方,但不能保证及时调用它来挽救您的生命。这根本不会改变整体情况。
https://stackoverflow.com/questions/13234586
复制相似问题