在旧的Androids <3上使用largeHeap的伎俩?

当我试图分配超过约.对于我的graphhopper项目,
Android 2.3(三星Galaxy 1)上的30MB我遇到了OutOfMemory错误.但我认识到,对于像Firefox和skobbler这样的应用程序,在同一台设备上,分配超过80MB是可能的!至少我看到任务管理器中使用了90甚至120MB的内存!

我发现较新的Android版本> = 3允许设置大堆标志(largeHeap = true),但Firefox如何为Android 2.3做这个?

最佳答案 我认为这些应用程序可能正在使用可能超出限制的本机内存(它们从本机代码请求内存).

即使没有本机代码,也可以通过使用ByteBuffer并调用allocateDirect来实现.这可以使用this hack进行验证.

更新可悲地,这只能通过this post的本机代码实现.他们已经将其包装在java utility call中.但是对于评论者’Delyan’建议以下仅用于Java的图像处理黑客攻击:

BitmapFactory.Options opts = new BitmapFactory.Options();
Field field = opts.getClass().getField("inNativeAlloc");
field.setBoolean(opts, true);

但是:“那就是说,请记住,这很危险.如果设备内存不足,那么oomkiller会先跟踪你.没有警告,没有任何警告,只有SIGKILL.所以,比以往任何时候都更好地回收你所做的一切需要而且非常非常小心!“

更新2最终我们可以通过反射来破解访问sun.misc.Unsafe,就像流行的Java-Chronicle project一样?

点赞