当我尝试分配超过约。对于我的graphhopper项目,Android 2.3(三星Galaxy 1)上的30MB我遇到了OutOfMemory错误。但我认识到,对于像Firefox和skobbler这样的应用程序,在同一台设备上,分配超过80MB是可能的!至少我在任务管理器中看到了90甚至120MB的已用内存!
我发现较新的Android版本> = 3允许设置大堆标志(largeHeap = true),但是Firefox如何为Android 2.3做这个呢?
答案 0 :(得分:2)
我认为可能是那些应用程序正在使用可能超出限制的本机内存(它们从本机代码请求内存)。
即使没有使用本地代码也可以使用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中一样?