4

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

我发现较新的 Android 版本 >= 3 允许设置大堆标志 (largeHeap=true),但是 Firefox 的人如何为 Android 2.3 执行此操作?

4

1 回答 1

2

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

即使没有本机代码,也应该可以通过使用ByteBuffer并调用 allocateDirect 来做到这一点。这可以使用这个 hack来验证。

更新遗憾的是,根据这篇文章,这只能通过本机代码实现。他们已将其包装在 java实用程序调用中。但对于评论者“Delyan”,建议使用以下仅限 Java 的 hack 来进行图像处理:

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

但是:“也就是说,请记住这是危险的。如果设备内存不足,oomkiller 会先追踪你。没有警告,没有什么,只是 SIGKILL。所以,比以往任何时候都更要回收你没有的东西'不需要而且非常非常小心!”

更新 2最终我们可以像流行的Java-Chronicle 项目中那样通过反射来访问sun.misc.Unsafe吗?

于 2013-05-03T11:18:45.130 回答