我在Eclipse Memory Analyzer(也称为MAT)的帮助下分析了我的Android应用程序的内存使用情况.有时我可以找到奇怪的android.graphics.Bitmap
类实例,利用大部分堆.问题是我找不到这个位图的来源,没有文件名,没有resourceID,什么都没有.我能找到的关于位图的所有信息如下:
mBuffer
我假设有一个带有图像像素阵列的场.但它采用的是一些内部Android格式,而不是PNG.
问题:如何从内存转储中查看此位图表示的图像?
无法弄清楚如何在Eclipse中安装MAT(内存分析器工具).需要这个程序来分析我的Android应用程序漏洞的堆.
觉得愚蠢,抱歉;-(
准确的步骤是什么?
我该怎么做Eclipse?选择Android SDK管理器或转到help => install new software =>然后在字段中输入url字符串(http://download.eclipse.org/mat/1.1/update-site/)?
尝试过两者 - 现在似乎没什么用.
非常感谢您的描述:-)
OutOfMemoryErrors
即使在确保我的所有位图都已正确缩放之后,我也一直面临着一些烦人的问题.事实上,这个问题似乎与Bitmaps根本没有关系,但我可能错了.
出于测试和错误隔离的目的,我一直在使用导航抽屉(不使用后退按钮)在两个活动之间切换(让我们称之为Main和List).我可以在DDMS中看到每次返回时分配的内存增加大约180 KB.
我已完成内存转储并使用eclipse MAT分析3个不同的时间点:
我怀疑内存泄漏,但我无法找到原因.根据内存转储,它看起来像是"剩余"并且java.lang.FinalizerReference
不断增加.这个问题的用户在FinalizerReferences
他的内存转储中也有很多,但答案还不是很清楚.
我在最后一个时间点提出的泄漏嫌疑人报告并不是很有帮助,因为它怀疑android.content.res.Resources
并且android.graphics.Bitmap
随着时间的推移似乎没有增长:
在其中一份报告中(遗憾的是,这里没有),我看到13个被android.widget.ListView
指出为潜在泄密嫌疑人的实例.
这些内存增加发生在活动之间的任何转换(不仅仅是本例中使用的Main和List).
如何找到(非显而易见的?)内存泄漏?我一直在摸不着头脑,所以任何帮助和提示都会很棒.
位图(@ OrhanC1):我已经评论Bitmap
了上面提到的两个活动中的任何实例,内存仍在增加.内存转储仍显示一些位图,但我相信它们与资源有关,而不是我分配的实际位图.
关于自定义字体(@erakitin):我正在使用它们,但我使用单例Typeface
在我的Application
上下文(public class MyApp extends Application
)中保留每个字体的单个实例.我已经尝试评论上面提到的两个活动中对字体的任何引用,内存仍然增加.
我不认为我正在泄漏Context
(@DigCamara):我没有在这两个活动中持有任何静态引用,我使用Application
上下文而不是Activity
在适配器中的's.如果我保持相同Activity
并进行一些屏幕旋转,则内存不会增加.
基于@ NickT的评论:我可以看到我有两个活动的很多实例.这些内存增加是否只是后端堆栈活动数量增加而不是内存泄漏的结果(虽然操作系统处理的内容显然没有)?如果我使用FLAG_ACTIVITY_REORDER_TO_FRONT
intent标志,那么内存只会增加,直到所有不同的活动都被实例化(一次).这个问题很有用:当内存不足时,Android不会从堆栈中查杀活动.
是否可以比较两个HPROF文件?怎么样?
出于好奇,我刚刚使用Eclipse Memory Analyzer测试了我的Android应用程序内存泄漏.
我遇到了一个奇怪的Bitmap,大小为512 x 512像素,占用了大约1兆字节的设备堆内存.
我检查了我的drawables文件夹,找不到那个大小的位图(512 x 512).
我开始谷歌搜索并遇到了这个问题,用户解释了如何在Memory Analyzer中获取"内存泄漏"参考后面的实际图像:
MAT(Eclipse Memory Analyzer) - 如何从内存转储中查看位图
我按照教程并在GIMP的帮助下,提取了以下图片:
所以我的问题是:
笔记:
更新:
在Selvin的建议和我的个人感觉的帮助下,这可能是一个系统问题,我测试了我的另外两个应用程序.
我测试的两个应用程序也在Memory Analyzer中显示了相同的Bitmap,消耗的字节数完全相同:
此外,我能够发现:
Bitmap的源始终与应用程序的LAUNCHER活动相关联.
那该怎么办呢?有办法摆脱它吗?
由于我在我的应用程序中执行内存密集型操作,因此我希望尽可能多地使用堆.
heap android memory-management bitmap eclipse-memory-analyzer
我正在调查使用Eclipse的Memory Analyzer(MAT)分析HPROF文件.统治者树,报告和OQL界面看起来非常有用.但所有这一切都必须通过MAT软件手动完成.
是否有命令行界面,因此我可以通过编程方式解析HPROF并自动生成自定义报告.
这对于集成此测试基础结构以进行自动内存分析非常有用.
顺便说一句,堆大小将在10-60MB之间.
在我的工作中,我们遇到了难以重现的OOM问题.或者,更准确地说,它很容易在一个系统上重现,使得该系统无法使用,但在相同的输入下难以在其他任何地方重现.
应用程序使用服务包装器作为服务运行.我们确实设法更改配置以启动它,并选择在OOM上输出堆转储文件,但不幸的是,它们被截断,很可能是由于服务包装器超时并在写入文件时终止进程.这很明显,因为最大内存设置为1GB,而hprof文件小到700MB,这对于OOM上的整个堆来说太小了.
需要花费大量资金来进一步配置包装器以使java进程有更长的时间来写出堆,但我们正在使用这两个选项来实现这一点:
wrapper.jvm_exit.timeout=600
wrapper.shutdown.timeout=600
Run Code Online (Sandbox Code Playgroud)
问题是,我能用截断的hprof文件做些什么有用吗?Eclipse MAT扼杀它们.Jhat似乎加载了它们,但随后只显示了3个大小为0的Java.Object实例.我试过YourKit,它无法写出它的oids文件.
在我看来,这些文件应该包含一些有用的,可访问的信息.有没有一个工具可以读取那里有什么?
感谢您的时间!
当我在Eclipse-Helios中使用Memory Analyzer时,我在'保留堆'列中获得1294736的数值,这个数值的单位是多少?是字节还是字节?
浅堆值的相同查询.
eclipse memory-leaks memory-management eclipse-memory-analyzer
Eclipse Memory Analyzer文档说它可以打开IBM可移植堆转储文件(*.phd):
http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html
但是,当我尝试打开一个时,我得到并且错误:
'heapdump.xxx.phd'. Check the error log for further details.
Not a HPROF heap dump (java.io.IOException)
Not a HPROF heap dump
Run Code Online (Sandbox Code Playgroud)
我尝试了两个菜单选项(文件>打开堆转储)和(文件>打开文件)