🧠 āĻ…্āϝাāύ্āĻĄ্āϰāϝ়েāĻĄে āĻŽেāĻŽোāϰি āϞিāĻ• (Memory Leak) āĻ•ী?

 

🧠 āĻ…্āϝাāύ্āĻĄ্āϰāϝ়েāĻĄে āĻŽেāĻŽোāϰি āϞিāĻ• (Memory Leak) āĻ•ী?

āĻŽেāĻŽোāϰি āϞিāĻ• āϘāϟে āϝāĻ–āύ āĻ…্āϝাāĻĒ āĻ…āĻĒ্āϰāϝ়োāϜāύীāϝ় āĻŽেāĻŽোāϰি āϧāϰে āϰাāĻ–ে āĻāĻŦং āϏেāϟি āĻ•āĻ–āύোāχ āϰিāϞিāϜ (release) āĻ•āϰে āύা। āĻāϰ āĻĢāϞে RAM āϧীāϰে āϧীāϰে āĻ­āϰে āϝাāϝ়, āĻ…্āϝাāĻĒ āϏ্āϞো āĻšāϝ়ে āϝাāϝ়, āĻāĻŦং āĻļেāώ āĻĒāϰ্āϝāύ্āϤ āĻ•্āϰ্āϝাāĻļ āĻ•āϰে

🔴 āϏāĻšāϜ āĻ•āϰে āĻŦāϞāϞে:
āϤুāĻŽি āϝāĻĻি āĻāĻ•āϟি āϘāϰ āĻ­াāĻĄ়া āύাāĻ“, āĻ•িāύ্āϤু āĻ•োāύোāĻĻিāύāĻ“ āĻŽā§ŸāϞা āĻŦাāχāϰে āĻĢেāϞো āύা, āϤাāĻšāϞে āĻāĻ•āϏāĻŽā§Ÿ āϘāϰ āĻŽā§ŸāϞা⧟ āĻ­āϰে āϝাāĻŦে āĻāĻŦং āϤুāĻŽি āφāϰ āĻĨাāĻ•āϤে āĻĒাāϰāĻŦে āύা—āĻāϟাāχ āĻŽেāĻŽোāϰি āϞিāĻ•!


💡 āĻ•েāύ āĻŽেāĻŽোāϰি āϞিāĻ• āĻšā§Ÿ? (What causes Memory Leak?)

📌 ā§§. Context-āĻāϰ āĻ­ুāϞ āĻŦ্āϝāĻŦāĻšাāϰ

👉 Activity āĻŦা Fragment-āĻāϰ āϰেāĻĢাāϰেāύ্āϏ āĻ•োāĻĨাāĻ“ āϰেāĻ–ে āĻĻেāĻ“ā§Ÿা, āĻ•িāύ্āϤু āϏেāϟি āφāϰ āĻĻāϰāĻ•াāϰ āύেāχ।

🔴 āĻ­ুāϞ āωāĻĻাāĻšāϰāĻŖ:

object MemoryLeakExample {
    var context: Context? = null
}

🔹 āĻāĻ–াāύে Context (Activity) āĻāĻ•āϟি āϏ্āϟ্āϝাāϟিāĻ• āĻ…āĻŦāϜেāĻ•্āϟে āϰাāĻ–া āĻšāϝ়েāĻ›ে, āϝা Activity āϧ্āĻŦংāϏ (destroy) āĻšāϞেāĻ“ āĻŽেāĻŽোāϰিāϤে āĻĨেāĻ•ে āϝাāĻŦে!

āϏāĻŽাāϧাāύ:
👉 Application Context āĻŦ্āϝāĻŦāĻšাāϰ āĻ•āϰো

object MemoryLeakExample {
    var context: Context? = null
        set(value) {
            field = value?.applicationContext
        }
}

📌 ⧍. Static variable-āĻ Activity reference āϰাāĻ–া

👉 āϝāĻĻি āĻāĻ•āϟি Activity-āĻāϰ reference āĻāĻ•āϟি static āĻ­েāϰি⧟েāĻŦāϞে āϰাāĻ–া āĻšā§Ÿ, āϤাāĻšāϞে āϏেāϟি āĻ—াāϰāĻŦেāϜ āĻ•াāϞেāĻ•āĻļāύ āĻĻ্āĻŦাāϰা āĻĒāϰিāώ্āĻ•াāϰ āĻšāĻŦে āύা

🔴 āĻ­ুāϞ āωāĻĻাāĻšāϰāĻŖ:

object MemoryLeakExample {
    var activity: Activity? = null
}

🔹 āĻāχ āĻ•োāĻĄāϟি Activity-āĻāϰ āĻŽেāĻŽোāϰি āϧāϰে āϰাāĻ–āĻŦে, āϝāĻĻিāĻ“ Activity āϧ্āĻŦংāϏ āĻšā§Ÿে āĻ—েāĻ›ে

āϏāĻŽাāϧাāύ:
👉 WeakReference āĻŦ্āϝāĻŦāĻšাāϰ āĻ•āϰো:

object MemoryLeakExample {
    private var activityRef: WeakReference<Activity>? = null
}

📌 ā§Š. Handler āĻŦা Thread āĻ­ুāϞāĻ­াāĻŦে āĻŦ্āϝāĻŦāĻšাāϰ āĻ•āϰা

👉 āϝāĻĻি āĻāĻ•āϟি Thread āĻŦা Handler Activity-āĻāϰ āĻŽেāĻŽোāϰি āϧāϰে āϰাāĻ–ে, āϤাāĻšāϞে Activity āĻŦāύ্āϧ āĻšāĻ“ā§Ÿাāϰ āĻĒāϰāĻ“ āϏেāϟি āĻŽেāĻŽোāϰি āϧāϰে āϰাāĻ–āĻŦে

🔴 āĻ­ুāϞ āωāĻĻাāĻšāϰāĻŖ:

val handler = Handler(Looper.getMainLooper())
handler.postDelayed({
    // āĻ•িāĻ›ু āĻ•াāϜ āĻ•āϰো
}, 5000) // 5 āϏেāĻ•েāύ্āĻĄেāϰ āϜāύ্āϝ Runnable āĻŽেāĻŽোāϰিāϤে āĻĨাāĻ•āĻŦে

🔹 āĻāĻ–াāύে Activity āĻŦāύ্āϧ āĻšā§Ÿে āĻ—েāϞেāĻ“, Runnable āĻāĻ–āύāĻ“ āĻŽেāĻŽোāϰিāϤে āĻĨাāĻ•āĻŦে āĻāĻŦং Activity-āĻāϰ āϰেāĻĢাāϰেāύ্āϏ āϧāϰে āϰাāĻ–āĻŦে

āϏāĻŽাāϧাāύ:
👉 WeakReference āĻŦ্āϝāĻŦāĻšাāϰ āĻ•āϰো āĻ…āĻĨāĻŦা Runnable remove āĻ•āϰো:

private val handler = Handler(Looper.getMainLooper())
private val runnable = Runnable {
    // āĻ•িāĻ›ু āĻ•াāϜ āĻ•āϰো
}

// onDestroy() āĻ āĻ—ি⧟ে handler āĻŦāύ্āϧ āĻ•āϰো
override fun onDestroy() {
    super.onDestroy()
    handler.removeCallbacks(runnable)
}

📌 ā§Ē. Anonymous Inner Class āĻŦ্āϝāĻŦāĻšাāϰ āĻ•āϰা

👉 āϝāĻĻি inner class (like Runnable, Listener) Activity-āĻāϰ āĻ­েāϤāϰে āĻĨাāĻ•ে, āϤাāĻšāϞে āϏেāϟি Activity-āĻāϰ āĻŽেāĻŽোāϰি āϧāϰে āϰাāĻ–āĻŦে।

🔴 āĻ­ুāϞ āωāĻĻাāĻšāϰāĻŖ:

class MyActivity : AppCompatActivity() {
    private val myRunnable = Runnable {
        // Activity-āĻāϰ āϰেāĻĢাāϰেāύ্āϏ āϧāϰে āϰাāĻ–āĻ›ে
    }
}

āϏāĻŽাāϧাāύ:
👉 Static Inner Class āĻŦ্āϝāĻŦāĻšাāϰ āĻ•āϰো:

private class MyRunnable(context: Context) : Runnable {
    private val contextRef = WeakReference(context)

    override fun run() {
        val context = contextRef.get()
        if (context != null) {
            // āĻ•াāϜ āĻ•āϰো
        }
    }
}

📌 ā§Ģ. View āϞিāĻ• (Leaked View)

👉 āϝāĻĻি Activity-āĻāϰ āĻ­িāω āĻ…āύ্āϝ āĻ•োāĻĨাāĻ“ āϧāϰে āϰাāĻ–া āĻšāϝ়, āϤাāĻšāϞে āϏেāϟি Activity-āĻāϰ āĻŽেāĻŽোāϰি āϧāϰে āϰাāĻ–āĻŦে

🔴 āĻ­ুāϞ āωāĻĻাāĻšāϰāĻŖ:

object MemoryLeakExample {
    var myTextView: TextView? = null
}

🔹 Static āĻ­েāϰিāϝ়েāĻŦāϞে View āϰাāĻ–āϞে āĻŽেāĻŽোāϰি āϞিāĻ• āĻšāϤে āĻĒাāϰে।

āϏāĻŽাāϧাāύ:
👉 onDestroy()-āĻ āĻ—ি⧟ে null āĻ•āϰে āĻĻাāĻ“:

override fun onDestroy() {
    super.onDestroy()
    myTextView = null
}

🚀 āĻŽেāĻŽোāϰি āϞিāĻ• āĻ–ুঁāϜে āĻŦেāϰ āĻ•āϰাāϰ āωāĻĒাāϝ়

1️⃣ Android Studio Profiler āĻŦ্āϝāĻŦāĻšাāϰ āĻ•āϰো

📌 Android Studio -> View -> Tool Windows -> Profiler
👉 āĻāĻ–াāύে Memory Usage āĻĻেāĻ–ো āĻāĻŦং Heap Dump āĻŦ্āϝāĻŦāĻšাāϰ āĻ•āϰে āĻŽেāĻŽোāϰি āϞিāĻ• āϚেāĻ• āĻ•āϰো।

2️⃣ LeakCanary āϞাāχāĻŦ্āϰেāϰি āĻŦ্āϝāĻŦāĻšাāϰ āĻ•āϰো

āĻāϟি āĻāĻ•āϟি Automatic Memory Leak Detector

āĻ•োāĻĄ āϝুāĻ•্āϤ āĻ•āϰো:

dependencies {
    implementation 'com.squareup.leakcanary:leakcanary-android:2.12'
}

👉 LeakCanary āϏ্āĻŦāϝ়ংāĻ•্āϰিāϝ়āĻ­াāĻŦে āĻŽেāĻŽোāϰি āϞিāĻ• āĻļāύাāĻ•্āϤ āĻ•āϰāĻŦে


🛠 āϏাāϰāϏংāĻ•্āώেāĻĒ (Brain-Friendly Guide)

🔹 āĻŽেāĻŽোāϰি āϞিāĻ• āĻŽাāύে: āĻ…āĻĒ্āϰ⧟োāϜāύী⧟ āĻŽেāĻŽোāϰি āϰিāϞিāϜ āύা āĻ•āϰা।
🔹 āĻ•াāϰāĻŖ: Context leak, Static variable, Handler, Thread, View leak āχāϤ্āϝাāĻĻি।
🔹 āϏāĻŽাāϧাāύ: WeakReference, Application Context, Handler remove, Static inner class।
🔹 āϚেāĻ• āĻ•āϰাāϰ āωāĻĒা⧟: Android Profiler, LeakCanary


āĻāĻ–āύ āĻ•ি āĻŽেāĻŽোāϰি āϞিāĻ• āĻĒāϰিāώ্āĻ•াāϰ āĻšāϝ়েāĻ›ে? 😊 āϝāĻĻি āĻ•োāύো āĻ…ংāĻļ āφāϰāĻ“ āĻŦিāϏ্āϤাāϰিāϤ āϜাāύāϤে āϚাāĻ“, āĻŦāϞো! 🚀

What is the memory leak in Android?

Comments

Popular posts from this blog

AI (Artificial Intelligence) āϏāĻšāϜāĻ­াāĻŦে āĻŦোāĻাāϰ āϜāύ্āϝ āĻāĻ•āĻĻāĻŽ āĻŽāϏ্āϤিāώ্āĻ•-āĻŦাāύ্āϧāĻŦ āĻŦ্āϝাāĻ–্āϝা 🧠🤖

🧠 Regex āĻ•ী?

Kotlin-āĻ āĻ­েāϰিāϝ়েāĻŦāϞ āϘোāώāĻŖা āĻ•āϰাāϰ āĻĻুāχ āωāĻĒাāϝ়