đ§ āĻ ্āϝাāύ্āĻĄ্āϰāϝ়েāĻĄে āĻŽেāĻŽোāϰি āϞিāĻ (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।
āĻāĻāύ āĻি āĻŽেāĻŽোāϰি āϞিāĻ āĻĒāϰিāώ্āĻাāϰ āĻšāϝ়েāĻে? đ āϝāĻĻি āĻোāύো āĻ ংāĻļ āĻāϰāĻ āĻŦিāϏ্āϤাāϰিāϤ āĻাāύāϤে āĻাāĻ, āĻŦāϞো! đ
Comments
Post a Comment