将数据存储在静态对象中而不会发生内存泄漏

时间:2013-11-27 14:37:56

标签: android android-memory

我正在尝试追踪一些用户在KitKat中开始出现内存错误的问题。我之前的版本中没有看到它们,但我知道内存使用率有时会比我预期的要高得多。

我正在尝试通过应用程序识别应用程序中当前存储在静态变量中的内容,并且有一些我想知道它们是否会导致问题。

他们是:

Notification   //as in when a notification is raise
PendingIntents   
BroadcastReceiver //as in the object passed to: context.registerReceiver     
SharedPreferences 

据我所知,我认为这些不包含上下文对象,但我不确定。

我尝试确保在使用上下文对象时,我只使用活动上下文,当范围仅适用于活动时以及需要该上下文时。对于其他情况,我使用应用程序上下文。

1 个答案:

答案 0 :(得分:0)

我建议你运行你的应用程序并使用你的应用程序包含的所有活动,并多次切换方向,然后退出应用程序并在转储hprof之后触发GC(所有这些按钮)您正在使用Eclipse)并触发泄漏嫌疑人报告,使用直方图按钮查看已完成的分配和#objects的排序(尝试过滤您的包名称,因为String / byte []等倾向于支配这样的泄漏嫌疑人报告,即使不必泄漏)。以下指南:debugging memory in Android

至于那些特定类的问题(当我说“可能泄漏上下文”时,我的意思是激活上下文,因为应用程序是单例):

  • 通知最好由Notification.Builder处理,其中一个采用上下文,因此保留静态变量中的通知可能会泄漏上下文

  • PendingIntents是从辅助方法中获取的,其中发送上下文,参见PendingIntent也可能泄漏上下文

  • BroadcastReceivers可以在清单(这里没有泄漏上下文)或运行时注册,如果你没有在onPause中注销(在onResume中注册),你可能会泄漏BroadcastReceiver,而后者又会泄漏当前的活动上下文(这)

  • 如果您的活动被重新创建,那么从当前活动中获取SharedPreferences也可能存在泄漏

这是一个难题,这就是为什么我建议你在我的答案的顶部建议你的应用程序。除此之外我还没有把握几个问题类作为静态实例变量,你想用它实现什么?特别是如果您不确定是否泄漏了上下文。