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

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

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

最佳答案

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

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

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

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

堆大小取决于什么因素:


堆大小主要取决于您所使用的设备的分辨率
使用,因为更高的分辨率需要更大的图像/位图大小才能适合
in。(更多像素=需要更多内存才能合并)
虽然,我没有得到任何书面证明。
了解堆大小还取决于RAM大小。因为,更大
RAM大小将使多任务处理具有更大的灵活性,而占用空间更少
获得“ OutOfMemoryError”的机会


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

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

07-28 01:34
查看更多