活动的第一个实例永远不会被垃圾回收?

5
我正在使用Eclipse Memory Analyzer Tool(MAT)调查我的Android活动是否存在内存泄漏。如果这个活动有一个泄漏,我希望死实例会挂在堆上,没有被垃圾回收。为了检查这一点,我反复启动和停止(通过按下Back按钮)活动,然后使用MAT检查堆转储。
但是我观察到一些奇怪的行为,我无法解释:第一个活动实例(在强制关闭之后启动)永远不会被垃圾回收。然而,随后的实例可以。我知道这个问题是通过MAT工具检查出来的:无论活动启动和停止多少次,MAT工具总是显示堆上的两个实例。第一个实例属于第一次启动活动时,而第二个实例则属于最近运行的活动。
任何想法可能发生的事情,以及我是否应该担心这个关于内存泄漏的问题?非常感谢您的建议。

2
可能有某些东西正在保留您的活动的原始实例,无论是实际活动还是在其中定义的变量。您可以使用MAT检查引用活动的内容,其中一个视图可以让您跟踪它。 - dmon
1
具体来说,您想要跟踪GC根以查看它所依赖的内容。 - CommonsWare
感谢这两条评论。许多内容都依赖于该活动,主要是成员对象。但是,执行“排除弱/软引用”似乎将其简化为Android映射组件。我的活动是MapActivity的子类。过时的活动对象似乎由android_maps_conflict_avoidance.com.google.googlenav.map.MapFlashService引用。也许这是一个已知问题 - 我会调查一下。 - Michael Pedersen
我一点也不会感到惊讶,因为 Maps V1 可能对你允许的唯一 MapActivity 实例保持了一个间接的静态引用。 - CommonsWare
是的 - 看起来MapActivity子类中存在内存泄漏的已知问题。请参见例如http://code.google.com/p/android/issues/detail?id=2181。我还没有找到适合我的解决方法。不过谢谢你的建议! - Michael Pedersen
@MichaelPedersen 请将其作为答案并关闭帖子。 - Warpzit
1个回答

0

最后来说一句:似乎MapActivity子类中存在已知的内存泄漏问题。例如,请参见code.google.com/p/android/issues/detail?id=2181。我还没有找到适合我的解决方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接