我正在使用Galaxy Nexus(i9250)进行开发和测试。我注意到奇怪的事实 - 有时当总堆大小为64mb且分配的堆大小在56-60mb左右时,应用程序崩溃。但有时候我注意到即使是内存也高达80mb,app也没有崩溃。
最初我认为范围nexus的设备的最大堆大小将是64mb(现在我意识到它是错误的)。所以我的问题是设备可以使用的最大堆大小是多少。如果它是基于设备的变量,则取决于堆大小所依赖的因素。我知道这是一个常见的问题。任何人都可以指导我找到正确的答案。提前谢谢!
注意:我的代码中没有使用LargeHeapSize = true;
答案 0 :(得分:1)
考虑到,每次提供“OutOfMemoryError”
时,您的应用都会崩溃DVM从分配一个小堆开始,在每个垃圾收集周期之后,它检查空闲堆并将其与总堆内存进行比较,并在差异太小的情况下添加更多内存。因此,根据操作系统的Dalvik VM要求,可以在运行时增加或减少堆。
因此,当他们的系统内存足够时,当内存高达80mb时,你的应用程序就不会崩溃。(假设64MB并不是堆大小的硬限制)
是的,每个设备的堆大小都有一个硬限制,可以通过使用“LargeHeapSize = true”来增加,但这在应用程序性能方面可能因为堆大小增加而过于昂贵与垃圾收集过程所花费的时间成正比(因为GC现在必须遍历更大堆内的更多对象)。所以这是一个很大的“不,不”,除非你确切知道什么以及为什么你要更大的堆大小。
关于堆大小的因素取决于:
堆大小主要取决于您所用设备的分辨率 使用,因为更多的分辨率需要更大的图像/位图大小来适应 in。(更多像素=需要更多内存合并)
虽然,我没有得到任何书面证据。按照我的说法 了解堆大小还取决于RAM大小。因为,更大的 RAM大小将允许更多的多任务和更少的灵活性 获得“OutOfMemoryError”
如果您需要知道可以使用的确切堆内存量, ActivityManager.getMemoryClass()。此方法返回一个整数,指示应用程序堆的可用兆字节数
ActivityManager.getLargeMemoryClass()更大的堆大小
答案 1 :(得分:0)
答案 2 :(得分: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。