android – 堆内存分配的工作原理
作者:互联网
我正在开发一个应用程序,我有内存问题.
我开始研究这个东西,我遇到了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?真?这是正常的吗?这是怎么回事?
请告诉我这个,因为我想知道这些内存分配是如何工作的.
解决方法:
检查堆使用有点棘手但同样容易.让我们来看看如何.
所以考虑一个小应用程序.您有Android调试工具来确定堆使用情况并检查它们.
你可以查看这个-memory-analysis-for-android,它有更多关于如何在android中有效分析应用程序的细节.
我们这里也有一个简短的描述:
启动DDMS有两种方法 –
1)使用Eclipse:单击Window> Open Perspective>其他…> DDMS
2)或从命令行:在tools /目录中运行ddms(或Mac / Linux上的./ddms)
然后从Devices中选择您的应用程序进程,然后单击“Update Heap”.
现在切换到DDMS中的Heap选项卡.
要查看第一次更新,请单击“原因GC”按钮.
你会看到这样的事情:
我们可以看到我们的集合(Allocated列)略高于20MB.如果你做一些小翻转,这个数字可以上升.在小型应用程序中,我们泄漏的内存量是有限的.在某些方面,这可能是最糟糕的泄漏,因为我们永远不会得到OutOfMemoryError,表明我们正在泄漏.
您可以使用堆转储来识别问题.单击DDMS工具栏中的转储HPROF文件按钮,然后将文件保存到任何位置.然后运行hprof-conv.
使用MAT作为强大的Memory Analyzer工具 –
您可以从SITE安装MAT,这是一个独立的内存分析器工具,并使用它分析堆转储.
注意:
如果你正在运行ADT(包括DDMS的插件版本)并且在Eclipse中安装了MAT,单击“dump HPROF”按钮将自动进行转换(使用hprof-conv)并打开转换后的hprof文件进入Eclipse(将由MAT打开).
启动MAT并加载转换后的HPROF文件.导航到直方图视图,该视图显示可按实例数排序的类列表,浅堆(所有实例使用的内存总量)或保留堆(所有实例保留的内存总量,包括其他对象)他们引用了).
如果我们按浅堆排序,我们可以看到byte []的实例位于顶部.
接下来,右键单击byte []类并选择List Objects>有来电参考.这将生成堆中所有字节数组的列表,我们可以根据Shallow堆使用情况对其进行排序.
选择一个大对象,然后向下钻取.这将显示从根集到对象的路径 – 保持此对象存活的引用链.瞧,有我们的位图缓存!
MAT无法确定这是否是泄漏,因为它不知道是否需要这些对象 – 只有程序员可以这样做.但是,查看统计信息可以预见,缓存相对于应用程序的其余部分使用了大量内存,因此我们可能会考虑限制缓存的大小.
一直这样,你会看到大量的性能优化.
标签:android,android-memory 来源: https://codeday.me/bug/20190825/1717896.html