当我试图在Android 2.3(三星Galaxy 1)上为我的graphhopper项目分配超过大约30MB时,我遇到了OutOfMemory错误。但我意识到,对于像Firefox和skobler这样的应用程序,在同一台设备上,分配超过80MB是可能的!至少我在任务管理器中看到了90甚至120MB的已用内存!
我发现较新的Android版本>=3允许设置大堆标志(largeHeap=true),但Firefox的家伙是如何为Android 2.3做到这一点的?
我认为可能是这些应用程序使用的本机内存超出了限制(它们从本机代码请求内存)。
即使没有本机代码,也应该可以通过使用ByteBuffer和调用allocateDirect。这可以使用此破解进行验证。
更新遗憾的是,根据这篇文章,这只能通过本机代码实现。他们已经将其封装在一个java实用程序调用中。但对于评论者"Delyan"来说,建议使用以下仅限Java的图像处理黑客:
BitmapFactory.Options opts = new BitmapFactory.Options();
Field field = opts.getClass().getField("inNativeAlloc");
field.setBoolean(opts, true);
但是:"也就是说,请记住这是危险的。如果设备内存不足,oomkiller会先追上你。没有警告,没有任何东西,只有SIGKILL。所以,比以往任何时候都更需要回收所有你不需要的东西,并非常小心!"
更新2最终我们可以像流行的Java Chronicle项目中那样,通过反射来访问sun.msic.Unsafe?