1

我正在开发的 Android 应用程序中有一个奇怪的内存行为。该应用程序运行良好,但如果我查看 Android 中的“任务管理器”,如三星 SII 任务管理器或 Nexus 7 上的“内存使用”应用程序,它表明在使用该应用程序时,使用的内存量很快增长到疯狂的数量,例如数百兆(在 Nexus 7 上为 600~700MB)。然后它可以回落到大约 200MB,再次增长等等。

起初我认为我的内存泄漏很严重,并开始在 Eclipse 内存分析器 (MAT) 中搜索问题,就像在这个优秀的视频中解释的那样。但问题是,从这里看起来一切正常。我没有发现任何重复的活动实例或任何其他可能导致泄漏的东西,并且报告的内存使用量要小得多。该问题也不会出现在 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 没有报告问题,我发现任务管理器报告如此高的内存使用率真的很奇怪。也许这里有人已经遇到过这种奇怪的行为,可以给我一个关于正在发生的事情的线索?

4

2 回答 2

1

好的,经过数小时的测试,我终于找到了问题所在。正如fadden 所猜测的那样,泄漏超出了Dalvik 的范围。这实际上是由于Typeface.createFromAsset中的以下错误:

http://code.google.com/p/android/issues/detail?id=9904

此方法正在泄漏资产流。我的应用程序正在使用自定义 TextView 来显示具有自定义字体的文本,并且由于它在大多数布局文件中使用它会迅速泄漏大量 RAM,但不会在 Dalvik 的堆中,所以使用通常的方法很难发现工具。

于 2013-01-30T00:22:55.143 回答
1

GC 消息仅显示 Dalvik 堆上的内容。本机堆可以无限制地增长——直到系统决定杀死你,只要你在前台,它就不愿意这样做。您的应用程序是否有可能导致分配的本机组件?

如果这是一个开发者/根设备,“procrank”工具可以给你一个内存使用的快速总结。“showmap”工具可以为您提供更详细的细分。

DDMS 有一些(官方不支持的)工具用于检查本机内存使用情况。Google for "ddms native heap" 找到一些说明。

于 2013-01-29T19:30:43.067 回答