2013-12-18 74 views
3

我正在开发应用程序,并且我有内存问题。 我开始研究这个东西,并且我遇到了Eclipse的调试系统。堆内存分配的工作原理

我使用DDMS的堆测试仪来查看我的应用程序分配了多少内存。 我看到它是关于90%。

现在我制作了一个简单的新项目,一个空白的空白活动没有任何功能或变量。只是一个辉煌的新项目。

跑这堆测试,我看到的结果:

Heap size: 10,629 MB 
Allocated: 9,189 MB 
Free: 1,440 MB 
Used: 86.45 % 
Objects: 44,565 

嗯,是正常的吗? 我有一个非常简单的空白活动,没有别的,这个应用程序使用86%的内存?

分配9 MB的10?真?这是正常的吗?这是如何工作的?

请告诉我这个,因为我想知道这些内存分配是如何工作的。

回答

2

检查堆使用是有点棘手,但同样容易。让我们来看看如何。

所以考虑一个小应用程序。您有Android调试工具来确定堆使用情况并对其进行检查。

你可以检查这个 - memory-analysis-for-android,它有更多的详细信息,如何在android中有效地分析应用程序。

让我们有一个简短的描述在这里太:

有两种方法来启动DDMS -

1)使用的Eclipse:单击窗口>打开透视图>其他...> DDMS

2)或命令行:运行DDMS(或./ddms在第的Mac/Linux的) e 工具/目录

然后从设备中选择您的应用程序并点击“更新堆”。

现在切换到DDMS中的Heap选项卡。 要查看第一次更新,请单击原因GC按钮。

你会看到这样的事情:

enter image description here

我们可以看到,我们集(the Allocated column)略微超过20MB。如果你做一些小动作,这个数字可能会增加。在小应用程序中,我们泄漏的内存量是有限的。在某些方面,这可能是最严重的泄漏,因为我们从未得到过指示我们泄漏的OutOfMemoryError。您可以使用堆转储来确定问题。单击DDMS工具栏中的转储HPROF文件按钮,然后将文件保存到任意位置。然后运行hprof-conv就可以了。

使用MAT这是一个功能强大的内存分析工具 -

您可以从SITE安装MAT这是一个stand-alone Memory Analyzer tool和分析堆转储使用它。

注: 如果你正在运行ADT(which includes a plug-in version of DDMS),并安装在Eclipse以及MAT,点击“转储HPROF”按钮,将自动进行转换(using hprof-conv),并打开转换HPROF文件到Eclipse (which will be opened by MAT)。

启动MAT并加载已转换的HPROF文件。导航到直方图视图其示出的类通过实例的数量,浅堆total amount of memory used by all instances),或保留的堆total amount of memory kept alive by all instances, including other objects that they have references to)排序一个列表。

如果我们按浅堆排序,我们可以看到byte []的实例位于顶部。

接下来,右键单击byte []类,然后选择List Objects> with incoming references。这将生成堆中所有字节数组的列表,我们可以根据浅堆使用情况进行排序。

挑选其中一个大对象,并在其上钻取。这将向您显示从根集到对象的路径 - 保持此对象活动的引用链。瞧,那就是我们的位图缓存!

MAT不能确定这是泄漏,因为它不知道这些对象是否需要 - 只有程序员可以做到这一点。但是,从统计数据来看,知道缓存相对于其他应用程序使用大量内存是可以预测的,因此我们可能会考虑限制缓存的大小。

一直以来都是这样,你会看到大量的性能优化。

0

你在这里看到的是分配的内存,而不是最大可分配的内存,可以分配的最大内存取决于Android版本和设备。

在这种情况下,您的应用程序没有任何高内存要求,所有用来运行应用程序的文件,系统和对象都非常小,因此最初android已经为您的应用程序分配了一个通用的初始空间,随着应用程序需求的增加直到遇到需求增加,或者超过android定义的每个应用程序定义的最大堆大小,在这种情况下,您的应用程序会崩溃,说明内存不足是原因。

要阅读的Android更多的内存分配经过下面的链接开发商

http://developer.android.com/training/articles/memory.html

4

的Dalvik最初将安排一定的堆大小为您的应用。在你的情况下,这是大约10 MB。由于您的应用程序需要更多内存,Dalvik会将堆大小增加至最大配置大小(对于不同的设备而言,这是不同的)。如果您的应用在达到最大值后仍需要更多内存,则会导致OutOfMemoryException

要了解更多关于Android的分析内存分配,从Android开发者博客看看这个优秀的文章:

http://android-developers.blogspot.in/2011/03/memory-analysis-for-android.html

+1

我们可以增加特定应用程序的堆大小吗? –

+0

在API 11及以上版本中,您可以在清单文件中使用'android:largeHeap =“true”'从操作系统请求一个大堆。请注意,这只是一个请求,操作系统可以完全忽略它。这应该非常谨慎地使用,而不是作为性能不佳的应用程序的失效保护。 –