Tracking memory leaks in Android apps is critical for ensuring a smooth user experience and optimal performance. This guide will show you how to detect memory leaks in Kotlin-based Android applications using Android Studio and the LeakCanary library.
Why Memory Leaks Matter
Memory leaks occur when your app holds references to objects that are no longer needed, preventing them from being garbage collected. Over time, this leads to increased memory usage, poor performance, and even app crashes.

Step-by-Step Guide to Track Memory Leaks
1. Add LeakCanary to Your Project
LeakCanary is a powerful memory leak detection library maintained by Square. It’s easy to integrate and gives real-time feedback during development.
Add this dependency to your build.gradle
(app-level):
dependencies { debugImplementation("com.squareup.leakcanary:leakcanary-android:2.12") }
LeakCanary automatically runs in debug builds and shows leak analysis results in the notification area.
2. Example App Setup
Let’s create a simple memory leak example using a Kotlin Activity that leaks a reference to its context.
MainActivity.kt
package com.example.memoryleakdemo import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.example.memoryleakdemo.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding companion object { var retainedObject: Any? = null // will leak context } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.btnLeak.setOnClickListener { retainedObject = this // leak this activity startActivity(Intent(this, SecondActivity::class.java)) } } }
SecondActivity.kt
package com.example.memoryleakdemo import android.os.Bundle import androidx.appcompat.app.AppCompatActivity class SecondActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_second) } }
3. Run Your App and Analyze
- Run your app in debug mode.
- Click the button to trigger the leak in
MainActivity
. - Navigate to
SecondActivity
. - Close the app or press back.
- LeakCanary will show a notification about the detected leak.
You’ll see a detailed analysis that includes the class and reference chain responsible for the memory leak.
4. Fixing the Leak
To fix this kind of leak, avoid holding long-lived references to context or activities.
// Bad: retainedObject = this // Good: use weak references or avoid static references to context
5. Monitor with Android Profiler
For more advanced tracking, you can use Android Studio’s Profiler.
Navigate to View > Tool Windows > Profiler and inspect memory usage while interacting with your app.
You can read more about memory leaks and LeakCanary from the official LeakCanary documentation.