我正在开发的Android应用程序中有一个奇怪的内存行为。该应用程序运行正常,但如果我在Android中查看“任务管理器”,如三星SII任务管理器或Nexus 7上的“Memory Usage”应用程序,它会显示在使用应用程序时的内存量使用迅速增长到疯狂的数量,如数百个megas(Nexus 7上600~700MB)。然后它可以回落到大约200MB,再次增长等。
起初我认为我的内存泄漏很糟糕,并开始在Eclipse Memory Analyzer(MAT)中搜索问题,就像在excellent video中解释的那样。但问题是,从这里一切看起来都不错。我没有找到任何可能导致泄漏的活动或其他任何重复实例,并且报告的内存使用量要小得多。问题也没有出现在GC消息中。所以我可以在任务管理器中报告600MB的使用情况,在Logcat中有类似的东西:
01-29 12:05:44.511: D/dalvikvm(6044): GC_FOR_ALLOC freed 3930K, 24% free 28959K/38096K, paused 17ms, total 17ms
堆积量永远不会超过50~60MB(这可能是正常的,因为应用程序中有很多图片)。 MAT中的数字匹配。
我想确保我的应用程序中存在内存泄漏。即使GC消息和MAT没有报告问题,我发现任务管理器报告如此高的内存使用量真的很奇怪。也许有人在这里已经遇到过这样一种奇怪的行为,可以给我一些关于发生了什么的线索?
答案 0 :(得分:1)
GC消息仅显示Dalvik堆上的内容。本机堆可以无限制地增长 - 直到系统决定杀死你,只要你在前台,它就不愿意这样做。您的应用是否具有可能导致分配的本机组件?
如果这是开发人员/ root用户设备,“procrank”工具可以为您提供内存使用情况的快速摘要。 “showmap”工具可以为您提供更详细的细分。
DDMS有一些(官方不支持的)工具,用于检查本机内存使用情况。谷歌为“ddms native heap”找到了一些指示。
答案 1 :(得分:1)
好的,经过几个小时的测试后我终于找到了问题。正如法登所猜测的那样,漏洞已经超出了Dalvik的范围。事实上,由于Typeface.createFromAsset中的以下错误:
http://code.google.com/p/android/issues/detail?id=9904
此方法正在泄漏资产流。我的应用程序使用自定义TextView显示带有自定义字体的文本,并且因为它在大多数布局文件中使用它会快速泄漏大量RAM,但不会在Dalvik的堆中,所以很难发现使用通常的工具。