为啥使用 Activity 上下文会导致 Context 内存泄漏
Posted
技术标签:
【中文标题】为啥使用 Activity 上下文会导致 Context 内存泄漏【英文标题】:Why using Activity context cause Context memory leak为什么使用 Activity 上下文会导致 Context 内存泄漏 【发布时间】:2014-10-18 12:32:01 【问题描述】:我在 Google 上多次搜索“使用 Application Context 或 Activity 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 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
Android:为啥我不能使用“Intent”移动到另一个Activity?
为啥运行时表达式会导致 Entity Framework Core 5 的缓存发生冲突?