我正在开发一款应用我有内存问题。 我开始研究这个东西,我遇到了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 ?真?这是正常的吗?这是如何工作的?
请告诉我这个,因为我想知道这些内存分配是如何工作的。
答案 0 :(得分:4)
Dalvik最初会为您的应用分配一定的堆大小。在您的情况下,这大约是10 MB。由于您的应用需要更多内存,Dalvik会将堆大小增加到最大配置大小(不同设备的大小不同)。如果您的应用在达到最大值后仍需要更多内存,则会产生OutOfMemoryException
。
要了解有关在Android中分析内存分配的更多信息,请查看Android开发者博客中的这篇优秀文章:
http://android-developers.blogspot.in/2011/03/memory-analysis-for-android.html
答案 1 :(得分:2)
检查堆使用情况有点棘手但同样容易。我们来看看如何。
所以考虑一个小应用程序。您有Android调试工具来确定堆使用情况并检查它们。
你可以查看这个 - memory-analysis-for-android,其中详细介绍了如何在android中有效地分析应用程序。
我们在这里也有一个简短的描述:
启动DDMS有两种方法 -
1)使用 Eclipse:点击Window> Open Perspective>其他...> DDMS
2)或从命令行运行:在工具/目录中运行ddms(或Mac / Linux上的./ddms ) / p>
然后从“设备”中选择您的申请流程,然后点击“更新堆”。
现在切换到DDMS中的“堆”选项卡。 要查看第一次更新,请单击原因GC 按钮。
你会看到这样的事情:
我们可以看到我们的集合(the Allocated column
)略高于20MB。如果你做一些小翻转,这个数字可以上升。在小型应用程序中,我们泄漏的内存量是有限的。在某些方面,这可能是最糟糕的泄漏,因为我们永远不会得到OutOfMemoryError
表明我们正在泄漏。
您可以使用堆转储来识别问题。单击DDMS工具栏中的转储HPROF文件按钮,然后将文件保存到任何位置。然后在其上运行hprof-conv
。
使用功能强大的Memory Analyzer工具MAT -
您可以从SITE stand-alone Memory Analyzer tool
安装 MAT ,并使用它来分析堆转储。
注意:强>
如果您正在运行ADT(which includes a plug-in version of DDMS
)并在Eclipse中安装了MAT,单击“dump 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>有来电参考。这将生成堆中所有字节数组的列表,我们可以根据Shallow堆使用情况对其进行排序。
选择一个大物体,然后向下钻取。这将显示从根集到对象的路径 - 保持此对象存活的引用链。瞧,有我们的位图缓存!
MAT 无法确定这是否是泄漏,因为它不知道是否需要这些对象 - 只有程序员可以这样做。但是,查看统计信息可以预见,缓存相对于应用程序的其余部分使用了大量内存,因此我们可能会考虑限制缓存的大小。
一直这样,你会看到大量的性能优化。
答案 2 :(得分:0)
你在这里看到的是分配内存而不是可以分配的最大内存,可以分配的最大内存取决于android版本和设备到设备。
在这种情况下,您的应用程序没有任何高内存要求,用于运行应用程序的所有文件,系统和对象都非常小,因此最初android已经为您的应用程序分配了一个共同的初始空间,现在这个空间继续随着app的需求增加直到满足,或超过每个应用程序由android定义的最大堆大小,在这种情况下,你的应用程序将崩溃说明内存耗尽的原因。
要阅读有关android中内存分配的更多信息,请参阅以下开发人员链接