我认为可能是这些应用程序正在使用可能超出限制的本机内存(它们从本机代码请求内存)。
即使没有本机代码,也应该可以通过使用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吗?