Android知识点18--内存泄露

130 阅读3分钟

1. 如何避免内存泄露?都有哪些场景?

Java中内存泄漏指的是存在一些被分配的对象,它们是可达的,但是程序以后都不会再使用这些对象。这些对象就可以判断为内存泄漏。 在Android中内存泄漏的原因很简单:生命周期长的对象持有生命周期短的对象的引用。

以下几种场景会导致内存泄漏:

  • 单例中持有context对象,使用时context传入activity之类的就会内存泄漏
  • 非静态内部类会造成内存泄漏
  • 外部类中持有非静态内部类的静态对象
  • Handler或Runnable作为非静态内部类(Handler和Runnable都有延时操作)
  • BroadcastReceiver未取消注册
  • InputStream未关闭
  • mvp模式下activity退出时,presenter仍持有activity的引用
@Override protected void onDestroy() { 
    super.onDestroy(); 
    presenter.detachView(); 
} 
public void detachView() { 
    view = null; 
}

2. 常见的内存泄露调查工具?

常见的用于检测和解决Android应用中内存泄漏问题的工具包括:

  1. LeakCanary:LeakCanary是一个流行的开源库,用于检测Android应用中的内存泄漏问题。它通过监视应用中的对象引用并生成详细的报告来帮助开发者发现潜在的内存泄漏情况。
  2. Android Studio Memory Profiler:Android Studio提供了内存分析工具,包括Memory Profiler,可以帮助开发者检测应用中的内存使用情况和潜在的内存泄漏问题。开发者可以使用Memory Profiler来监视内存分配、堆内存使用情况等。
  3. MAT(Memory Analysis Tool):MAT是一个Java堆内存分析工具,可以帮助开发者分析Java应用程序的内存使用情况,包括检测内存泄漏和分析内存占用情况。MAT通常用于分析Heap Dump文件。
  4. Profilo:Profilo是Facebook开源的性能分析工具,其中包含一些用于检测内存泄漏和内存占用问题的功能。Profilo可以帮助开发者识别和解决Android应用中的性能问题。
  5. Memory Leak Detection Library:Memory Leak Detection Library是一个用于检测Android应用中内存泄漏问题的库,提供了一些工具和方法来帮助开发者发现和解决内存泄漏情况。

3. LeakCanary的原理?

LeakCanary是一个用于检测Android应用中内存泄漏问题的开源库。 其原理基于Android系统提供的弱引用(WeakReference)和引用队列(ReferenceQueue)机制,以及MAT(Memory Analysis Tool)工具提供的堆内存分析功能。 LeakCanary的工作原理如下:

  1. 弱引用和引用队列:LeakCanary通过创建一个包含目标对象的弱引用,并将其注册到一个引用队列中。如果目标对象被垃圾回收器回收,那么该弱引用会被加入到引用队列中。
  2. 检测内存泄漏:LeakCanary在应用启动时初始化,并定期检测引用队列中是否有弱引用对象。如果发现有弱引用对象存在,说明目标对象没有被正确释放,可能存在内存泄漏问题。
  3. 生成分析报告:一旦检测到内存泄漏,LeakCanary会生成一个详细的分析报告,包括泄漏对象的引用链(Reference Chain)、泄漏对象的类名、泄漏对象被持有的上下文等信息。
  4. 显示通知:LeakCanary通常会以通知的形式提醒开发者发现的内存泄漏问题,让开发者及时定位和解决问题。