为啥使用 Activity 上下文会导致 Context 内存泄漏

Posted

技术标签:

【中文标题】为啥使用 Activity 上下文会导致 Context 内存泄漏【英文标题】:Why using Activity context cause Context memory leak为什么使用 Activity 上下文会导致 Context 内存泄漏 【发布时间】:2014-10-18 12:32:01 【问题描述】:

我在 Google 上多次搜索“使用 Application ContextActivity Context”。

大部分答案是:“尽可能使用应用上下文getApplicationContext()来防止上下文内存泄漏”。

我很困惑:

为什么使用 Activity 上下文可能会导致内存泄漏:

Activity上下文与活动相关联,如果活动被销毁,则可以被销毁”

但是

应用程序上下文与应用程序相关联,并且在应用程序的整个生命周期中始终保持不变——它不会改变”?

【问题讨论】:

【参考方案1】:

Activity 实例是暂时的:它们根据用户与您的应用程序的交互来来去去。您的应用程序总体上有一个 Application 实例,该实例在您的应用程序进程的整个生命周期中都存在。举个简单的例子:用户通过启动器(主屏幕)启动您的应用程序,您的MainActivity 被创建并启动。如果这是第一次启动,那么您的应用程序的进程也会启动一个 Application 上下文。用户按下BACK 键,您的MainActivity 退出,通过其onDestroy()。现在,如果用户重新启动您的应用程序,则会创建一个新的 MainActivity 实例。但是,您的应用程序的进程没有被杀死(假设没有内存压力),因此 Application 对象单例仍然存在并且有效。您原来的 MainActivity 实例不存在。

【讨论】:

因为我的“原始MainActivity”已退出,所以所有引用/变量然后内存也会被释放? 不一定,这是内存泄漏问题的根本原因。如果您将活动用作与活动的生命周期无关的内容的上下文,然后您的活动被销毁(生命周期),则垃圾收集器无法丢弃您的 Activity 对象,因为仍然持有强引用.有关更多详细信息,请查看此 Google android 开发者博客:android-developers.blogspot.com/2009/01/…

以上是关于为啥使用 Activity 上下文会导致 Context 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

为啥 nsqlookupd 包使用上下文?

Android:为啥我不能使用“Intent”移动到另一个Activity?

为啥运行时表达式会导致 Entity Framework Core 5 的缓存发生冲突?

无法从 BottomSheetDialog 启动Activity

为啥完成Activity会抛出NPE?

AndroidStudio 内存泄漏的分析过程