【问题标题】:Trick to use largeHeap on older Androids < 3?在 < 3 的旧 Android 上使用 largeHeap 的技巧?
【发布时间】:2013-11-26 00:08:07
【问题描述】:

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

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

【问题讨论】:

  • Android 中没有“任务管理器”。
  • 嗯,但我有一个 - 也许是三星软件?我会检查
  • 我的意思是你不知道这个“任务管理器”实际测量的是什么。 Dianne Hackborn 写了the definitive answer on measuring memory consumption,你会注意到她并不依赖随机硬件中的随机“任务管理器”应用程序。
  • 好的,这很好。 (顺便说一句:任务管理器是三星的应用程序)

标签: android memory-management graphhopper


【解决方案1】:

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

即使没有本机代码,也应该可以通过使用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 最终我们可以像流行的Java-Chronicle project 一样通过反射来访问sun.misc.Unsafe

【讨论】:

  • 请记住,“inNativeAlloc”在较新的 framework.jars 中不存在。如果您事先知道位图大小,您还可以做另一件事。您可以制作一个相同大小的空白 png(BitmapFactory 会将其从 Java 堆中删除),对其进行解码并强制“mIsMutable”标志为真。然后,您可以对其进行绘制。不幸的是,您需要提前知道像素大小。 :/ 来源 - 我已经花了几个小时。另外,我是那个网页上的人。
猜你喜欢
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多