分配本机内存时内存不足

she*_*lll 5 android memory-management native opengl-es

我将许多纹理加载到(Open GL)应用程序(内存中未压缩的数百兆字节)中,因此我使用LRU缓存并在需要时丢弃它们.在Android中,Open GL纹理在本机堆中分配,因此我可以使用所有可用内存.

问题是......

ActivityManager activityManager = (ActivityManager)VhbApplication.getInstance().getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
memoryInfo.availMem
Run Code Online (Sandbox Code Playgroud)

availMem报告在某些设备上奇异数:银河标签10.1 3.2 - 160MiB和系统显示300MiB免费,宏基ICONIA TAB A200与4.0.3报告可用内存作为系统〜400MiB相同的值.第二个问题是,宏碁,我得到了内存不足的错误(不OutOfMemoryError错误的形式,可以被捕获为异常.然后它就击中SIGSEGV)分配尺寸小于200MiB的纹理也是如此.并非总是如此,但如果应用程序运行足够长的时间,一些纹理从缓存中删除,新的加载,那么应用程序可能会崩溃.

所以我无法以非常强大的方式设置缓存大小.那些随机的OOM崩溃只与宏碁有关.我喜欢的Galaxy Tab 10.1,的Nexus 7,甚至GALAXY NOTE(5" )我得到这些随机崩溃的其他设备.我正常删除的Open GL纹理.

Acer是否有一些限制在他们的Androids中,不仅限制了VM内存大小,还限制了本机堆分配?或者它是一个有缺陷的Open GL驱动程序?Acer和Galaxy标签使用几乎相同的Tegra 2 GPU.

如何可靠地设置缓存大小?我需要至少100MiB.或者以其他方式将100-200 MiB的纹理强大地分配到Android Open GL应用程序中?