是否可以使用超过最大的android堆?

时间:2015-05-07 13:14:03

标签: java android heap

如果单个应用程序只能使用32mb堆,为什么Android设备需要1或2GB RAM?我无法将大图像加载到RAM中,例如3000x3000(仅为34mb)。

2 个答案:

答案 0 :(得分:1)

可用,here,在Android文档中,使用

android:largeHeap="true"

允许您使用更大的堆大小,但建议您在可能的情况下使用较小的图像。

  

是否应该使用大型创建应用程序的进程   达尔维克堆。这适用于为此创建的所有进程   应用。它只适用于第一个加载到的应用程序   处理;如果您使用共享用户ID来允许多个   要使用进程的应用程序,它们都必须使用此选项   一直或他们将有不可预测的结果。大多数应用应该   不需要这个,而应该专注于减少他们的整体   内存使用以提高性能。启用此功能也不会   保证固定增加可用内存,因为有些设备   受到总可用内存的限制。

     

要在运行时查询可用内存大小,请使用这些方法   getMemoryClass()或getLargeMemoryClass()。

答案 1 :(得分:0)

是的,这是真的。有些人可能会认为这在开发Android应用程序时是一个最大的挑战,特别是那些需要加载大型图像的应用程序。

解决此问题的最佳方法是在使用Android应用程序时简单地接受此限制,并在创建Bitmaps时非常小心。原则上,内存中永远不会有比一次在屏幕上显示的位图更多的位图。这意味着加载较小的位图,并回收不再使用的位图。

但有时候,你需要同时持有大量的位图,这个数量超出了每个应用程序的内存限制。

为此,也许最好的选择是将这些位图渲染为OpenGL-ES纹理。

在Android中使用OpenGL-ES时,纹理(实际上是Bitmaps的OpenGL名称)保存在设备的堆上,并且不受与普通位图相同的内存限制。在这里,您可以充分利用设备RAM。

对于开发人员来说,OpenGL-ES被认为是一个稍微“高级”的主题,但是如果你按照this one这样的一些教程,你可以很快地设置一些基础知识。

最后,您还可以在清单文件new Buffer('Laurence Tureaud is Mr. T').toString('base64'); TGF1cmVuY2UgVHVyZWF1ZCBpcyBNci4gVA== 中进行定义。这将为您的应用程序分配更多的内存,但最终,您将遇到与以前相同的问题 - 无法访问完整的设备内存。如果你只需要更多的内存,这是一个很好的修复,但如果你的内存需求非常大,那么它可能是不够的。