Android应用程序堆大小

时间:2013-11-19 13:49:00

标签: android heap-memory

Android如何确定应将特定数量的堆分配给应用程序?

例如,如果应用程序大小为13 MB,并且在

上加载了应用程序

使用ram 512的MDPI设备为它分配20mb的堆大小

如果已加载

设有HDPI ram的

512 mb设备已分配50mb ram

如果已加载

带有HDPI内存的

1MB设备仍然分配50mb ram

XHDPI设备1gb Ram分配68mb

带有XXHDPI ram的

2GB设备分配134mb堆大小

我的问题是

  • Android如何计算和分配应用程序的大小?
  • 此分配是否取决于RAM大小或设备类型(如mdpi,hdpi等)或依赖于两者?
  • 是否取决于OS ver?
  • 任何特定的公式android OS用于计算和分配应用程序的内存?

2 个答案:

答案 0 :(得分:2)

我会看一下developer docs

  

分配和回收应用程序内存

     

以下是有关Android如何分配然后回收内​​存的一些事实   来自您的应用:

     

每个进程的Dalvik堆都被限制为单个虚拟   记忆范围。这定义了逻辑堆大小,它可以随之增长   需要(但最多只能达到系统为每个人定义的限制)   应用程序)。堆的逻辑大小与数量不同   堆使用的物理内存。检查应用程序堆时,   Android计算一个名为比例集大小(PSS)的值   同时考虑与其他人共享的脏页面和干净页面   进程 - 但仅限于与应用程序数量成比例的数量   分享那个RAM。这个(PSS)总数是系统认为的   你的物理内存占用。有关PSS的更多信息,请参阅   调查你的RAM使用指南。 Dalvik堆没有   压缩堆的逻辑大小,这意味着Android没有   对堆进行碎片整理以关闭空间。 Android只能收缩   堆末尾有未使用空间时的逻辑堆大小。   但这并不意味着堆使用的物理内存不能   收缩。在垃圾收集之后,Dalvik走了堆并找到了   未使用的页面,然后使用madvise将这些页面返回到内核。   因此,应该产生大块的配对分配和解除分配   收回所有(或几乎所有)所用的物理内存。然而,   从小分配中回收内存的效率要低得多   因为用于小分配的页面仍然可以与之共享   还有一些尚未被释放的东西。

     

限制应用程序内存

     

为了维持功能性的多任务环境,Android设置了一个   每个应用程序的堆大小的硬限制。确切的堆大小限制   根据设备可用的RAM量,设备之间会有所不同   总体。如果您的应用已达到堆容量并尝试   分配更多内存,它将收到OutOfMemoryError。

     

在某些情况下,您可能希望查询系统以确切地确定   您在当前设备上可用的堆空间量   例如,确定保存在缓存中的安全数据量。您   可以通过调用getMemoryClass()来查询系统中的这个数字。这个   返回一个整数,表示可用的兆字节数   你的应用程序的堆。这将在下面进一步讨论,检查多少   你应该使用的记忆。

只是提取您想要的信息:

  1. 确切的堆大小限制因设备而异 RAM设备总体上可用。

  2. 您可以深入研究源代码以了解堆内存的方式 计算,但我不确定你将从中获得什么。

  3. 堆内存可能因操作系统版本而异 将影响服务和操作系统资源使用的许多差异 在取得此设备后,设备可用的RAM数量 总RAM。

  4. 如果您真的在内存堆上寻找深度信息,我会使用内存调试工具detailed here

答案 1 :(得分:1)

这不是真正的计算。堆内存根据需要从底层操作系统分配,最高可达VM特定限制。你看到的是分配的堆大小。

为什么不同设备的不同之处主要是因为更高分辨率的位图需要更多内存。