2013-04-07 167 views
2

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

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

注:我没有在我的代码

+4

对于应用的堆

ActivityManager.getLargeMemoryClass()可用兆字节数你在做什么,需要那么多的堆空间? – 2013-04-07 19:40:27

+5

我知道这很挑剔,但是当人们没有具体说明他们需要具体说明的事情时,我发现它令人难以置信地烦人。有Nexus One,Nexus S,Galaxy Nexus,Nexus 4,Nexus 7和Nexus 10.你告诉我们你正在使用“Nexus”,你可能会告诉我们你正在使用“Android”。我假设这是一个7或10,但cmon的人... – 2013-04-07 19:54:02

+0

http://stackoverflow.com/questions/5350465/android-heap-size-on-different-phones-devices-and-os-版本 – dongshengcn 2013-04-07 20:07:05

回答

0

使用LargeHeapSize = true;目前尚不清楚什么设备你究竟在说什么。目前还不清楚你如何计算你的堆内存。

我建议你使用这个link

计算你的堆内存和可用存储但是,如果你的应用程序使用本机内存,它们是对link没有限制。

+0

我正在使用nexus i9250(galaxy nexus)。我没有计算堆大小,而是在谈论Eclipse显示的堆大小(您可以在DDMS中看到它)。 – 2013-04-07 20:11:43

0

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

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

如果您试图更好地理解Android上的内存管理,那么您应该阅读Android Framework Engineer @ hackbod的答案:How to Discover Memory Usage of My Application in Android

1

考虑,您的应用程序崩溃,每次给时间“的OutOfMemoryError”

DVM开始通过分配一个小堆,每个垃圾收集周期之后它会检查免费堆,并将其与总堆内存并增添了更多如果差异太小,内存不足。所以根据Dalvik VM对操作系统的要求,堆​​可以在运行时增加或减少。

所以,当他们足够的可用内存在系统中您的应用程序没有得到坠毁时,内存最多拍摄80MB(64MB假设不是堆大小的硬限制)

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

什么因素堆大小取决于:

  • 堆的大小主要取决于你是 使用,随着越来越多的分辨率需要较大的图像/位图尺寸以适应 设备的分辨率。(更多像素=需要更多的内存纳入)

  • 虽然,我没有通过任何这种书面证明,得到了..按我的理解 堆大小还取决于RAM的大小。因为,更大的
    RAM大小将允许多任务处理更灵活,并得到的较小
    机会“的OutOfMemoryError”

如果你需要知道的堆内存的确切数额,你可以使用,ActivityManager .getMemoryClass()。此方法返回一个整数,指示较大的堆大小