2

我正在使用 Galaxy Nexus(i9250) 进行开发和测试。我注意到一个奇怪的事实——有时当总堆大小为 64mb 并且分配的堆大小在 56-60mb 左右时,应用程序崩溃。但有时我注意到即使内存高达 80mb,应用程序也没有崩溃。

最初我认为范围 nexus 的设备的最大堆大小为 64mb(现在我意识到这是错误的)。所以我的问题是设备可以使用的最大堆大小是多少。如果它是基于设备的变量,那么堆大小取决于什么因素。我知道这是一个常见的问题。谁能引导我找到正确的答案。提前致谢!

注意:我没有LargeHeapSize = true; 在我的代码中使用

4

3 回答 3

1

考虑到,您的应用程序每次出现“OutOfMemoryError”时都会崩溃

DVM 首先分配一个小堆,在每个垃圾回收周期后,它会检查空闲堆并将其与总堆内存进行比较,并添加更多内存以防差异太小。因此,可以根据操作系统对 Dalvik VM 的要求在运行时增加或减少堆。

因此,当系统中有足够的可用内存时,您的应用程序不会在内存猛增至 80mb 时崩溃。(假设 64MB 不是堆大小的硬限制)

是的,每个设备的堆大小都有一个硬限制,可以通过使用"LargeHeapSize = true"来增加,但这在应用程序性能方面可能过于昂贵,因为增加的堆大小与垃圾所花费的时间成正比收集过程(因为 GC 现在必须遍历更大堆内的更多对象)。所以这是一个很大的“不,不”,除非你确切地知道你要什么以及为什么要使用更大的堆大小。

堆大小取决于什么因素:

  • 堆大小主要取决于您使用的设备的分辨率,因为更高的分辨率需要更大的图像/位图大小才能适应。(更多像素 = 需要更多内存来合并)

  • 虽然,我没有通过任何书面证明。根据我的理解,堆大小还取决于 RAM 大小。因为,更大的
    RAM 大小将允许更多的多任务处理灵活性和更少的
    机会获得“OutOfMemoryError”

如果您需要知道可以使用的确切堆内存量,请使用ActivityManager.getMemoryClass()。此方法返回一个整数,指示您的应用程序堆可用的兆字节数

ActivityManager.getLargeMemoryClass()用于更大的堆大小

于 2017-04-25T14:21:23.833 回答
0

目前尚不清楚您到底在说什么设备。也不清楚您是如何计算堆内存的。

我建议您使用此链接计算您的堆内存和可用内存

但是,如果您的应用程序使用本机内存,则它们对该链接没有任何限制。

于 2013-04-07T20:03:48.787 回答
0

我只会使用 DDMS 值作为查找内存泄漏和内存分配问题的指南,而不是使用您可以定位的特定数字。任何 Android 应用程序都需要在各种设备上运行,因此虽然您可能已经针对“Galaxy Nexus”调整了应用程序,但您希望能够在旧设备上运行,并进行适当的测试。见@dongshengcn 评论。

除了@minhaz 的链接,我还会阅读:Understanding Heap Size

如果您想更好地了解 Android 上的内存管理,那么您应该阅读 Android 框架工程师 @hackbod 的回答:如何在 Android 中发现我的应用程序的内存使用情况

于 2013-04-07T21:01:44.997 回答