Heap Dump: یہ کیا ہے، ہیپ کا تجزیہ اور میموری لیک کا خاتمہ

مصنف: IT Sectr اشاعت: 2026-05-07 مطالعے کا وقت: 10 منٹ

Heap Dump (ہیپ ڈمپ) ایپلیکیشن کی ڈائنامک میموری کا ایک سنیپ شاٹ ہے جس میں تمام زندہ آبجیکٹس کے بارے میں مکمل معلومات ہوتی ہیں: ان کی کلاسیں، سائز، آپسی حوالہ جات اور GC جڑوں سے رسائی۔ Heap Dump میموری لیک کے تجزیہ اور وسائل کی کھپت کو بہتر بنانے کا بنیادی ٹول ہے۔ Android Developers کے مطابق، heap dump تجزیہ 95% تک میموری لیک کا پتہ لگا سکتا ہے، بشمول چکری حوالہ جات، بھولے ہوئے listeners اور جاری نہ کیے گئے جامد حوالہ جات۔

اہم نکات

  • Heap Dump ایپلیکیشن کی پوری ڈائنامک میموری کا سنیپ شاٹ ہے جس میں ہر آبجیکٹ اور ان کے درمیان حوالہ جات کی معلومات ہوتی ہیں۔
  • Android Studio Memory Profiler Java اور Kotlin ایپلیکیشنز کے لیے ریئل ٹائم میں heap dump کیپچر کرنے کی اجازت دیتا ہے۔
  • Xcode Instruments iOS/macOS پر heap dump بنانے اور تجزیہ کرنے کے لیے Allocations ٹول فراہم کرتا ہے۔
  • Shallow اور retained size اہم میٹرکس ہیں: shallow آبجیکٹ کے خود کے سائز کو ظاہر کرتا ہے، retained آبجیکٹ کے سائز اور اس کے پکڑے ہوئے تمام آبجیکٹس کو ظاہر کرتا ہے۔
  • Heap dump کا تجزیہ dominator tree میں تلاش، سب سے بڑے retained آبجیکٹس اور GC جڑوں تک مختصر ترین راستے تلاش کرنا شامل ہے۔

Heap dump کیا ہے اور اس کی ضروری کیوں ہے

Heap dump ورچوئل مشین کے ہیپ کا مکمل ڈمپ ہے — میموری کا وہ علاقہ جہاں تمام ڈائنامک طور پر بنائے گئے آبجیکٹس رہتے ہیں۔ Java اور Kotlin میں یہ Android پر Dalvik/ART ہیپ ہے، Swift اور Objective-C میں یہ iOS پر ARC سے منظم ہیپ ہے۔ Heap dump ہر آبجیکٹ، اس کی کلاس، سائز، فیلڈز، دوسرے آبجیکٹس کے حوالہ جات اور GC جڑوں سے رسائی کے جھنڈوں کو کیپچر کرتا ہے۔

Heap dump کا بنیادی مقصد میموری لیک کا پتہ لگانا ہے۔ لیک اس وقت ہوتی ہے جب ایپلیکیشن ان آبجیکٹس کے حوالہ جات رکھنا جاری رکھتی ہے جو مزید ضروری نہیں ہیں، جو کوڑا کرکٹ جمع کرنے والے کے ذریعے ان کے جمع ہونے کو روکتی ہے۔ عام وجوہات: activity تباہ ہونے پر غیر رجسٹرڈ ایونٹ listeners؛ سیاق و سباق کے حوالہ جات کے ساتھ سنگلٹن؛ self کو کیپچر کرنے والے closures؛ جامد مجموعے جہاں ڈیٹا بغیر ہٹائے شامل کیا جاتا ہے۔ Heap dump ایک درست تصویر فراہم کرتا ہے: کون سے آبجیکٹس «زندہ» ہیں، کون سے غیر ضروری ہیں، اور کون بالکل ان کا حوالہ دے رہا ہے۔

Google I/O کے مطابق، Android ایپ کے کریش رپورٹس کا 60% سے زیادہ OutOfMemoryError سے متعلق ہے، اور 80% صورتوں میں بنیادی وجہ ایک میموری لیک ہے جو heap dump کے ذریعے قابل دریافت ہے۔ iOS ایپس کے لیے صورت حال یکساں ہے: retain cycles کی وجہ سے لیک کریش کی سب سے عام وجوہات میں سے ایک ہیں، جو Xcode میں Allocations آلے کے ذریعے پہچانی جاتی ہیں۔

Heap dump کب ضروری ہے

Heap dump درج ذیل علامات پر کیا جانا چاہیے: ایپلیکیشن بار بار کی جانے والی کارروائیوں کے دوران لکیری طور پر میموری استعمال کرتی ہے؛ اسکرین بند کرنے کے بعد میموری بنیادی سطح پر واپس نہیں آتی؛ OutOfMemoryError یا iOS پر میموری انتباہ ظاہر ہوتے ہیں؛ میموری کی حد سے تجاوز کرنے پر ایپلیکیشن ختم ہو جاتی ہے۔ Instagram اور Spotify جیسے بڑے موبائل منصوبوں میں باقاعدہ heap dump جمع کرنا انجینئرنگ کلچر پروٹوکول کا حصہ ہے۔

Android Studio میں Heap dump: حصول اور تجزیہ

Android Studio Memory Profiler فراہم کرتا ہے — ریئل ٹائم میں heap dump کیپچر کرنے کے لیے ایک بلٹ ان ٹول۔ View → Tool Windows → Profiler کے ذریعے رسائی حاصل کی جا سکتی ہے۔ ایپلیکیشن لانچ کرنے کے بعد، سیشن منتخب کریں، Memory ٹیب پر جائیں اور Dump Java Heap پر کلک کریں۔ Android Studio ایپلیکیشن کو روکتا ہے، ART ہیپ ڈمپ کرتا ہے اور تجزیہ کے لیے نتیجہ لوڈ کرتا ہے۔ ڈمپ فائل .hprof فارمیٹ میں ہے — HPROF معیار جو زیادہ تر میموری تجزیہ کاروں کے ساتھ مطابقت رکھتا ہے۔

ڈمپ لوڈ کرنے کے بعد، Android Studio کالموں کے ساتھ ایک آبجیکٹ ٹیبل دکھاتا ہے: Allocations (مثالوں کی تعداد)، Native Size (ART ہیپ کے باہر میموری)، Shallow Size (آبجیکٹ کی اپنی میموری)، Retained Size (پورے ذیلی گراف سمیت آبجیکٹ کی میموری)۔ کلاس نام کے لحاظ سے فلٹرنگ، retained size کے لحاظ سے ترتیب اور پیکجوں کے لحاظ سے تلاش آپ کو مسئلہ والے علاقوں کو جلدی تلاش کرنے کی اجازت دیتی ہے۔

kotlin
// عام لیک — onDestroy میں غیر رجسٹرڈ listener
class MainActivity : AppCompatActivity() {
    private val sensorManager by lazy {
        getSystemService(SENSOR_SERVICE) as SensorManager
    }
    private val listener = MySensorListener()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        sensorManager.registerListener(listener,
            sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),
            SensorManager.SENSOR_DELAY_NORMAL)
    }

    override fun onDestroy() {
        super.onDestroy()
        // ❌ sensorManager.unregisterListener(listener) غائب
        // → Activity GC نہیں ہوگی، heap dump لیک دکھائے گا
    }
}

Android Studio میں dominator tree کا تجزیہ

Dominator Tree ٹیب ان آبجیکٹس کو دکھاتا ہے جو سب سے زیادہ میموری رکھتے ہیں۔ اگر کسی آبجیکٹ کو dominator tree سے ہٹا دیا جاتا ہے، تو اس کی رکھی ہوئی تمام میموری کوڑا کرکٹ جمع کرنے کے لیے دستیاب ہو جاتی ہے۔ یہ ایک اہم ٹول ہے: ہزاروں آبجیکٹس کو اسکین کرنے کے بجائے، آپ 10–20 پر توجہ مرکوز کرتے ہیں جو 80–90% میموری کو کنٹرول کرتے ہیں۔ Google کے مطابق، dominator tree تجزیہ لیک پوائنٹ تلاش کرنے کا سب سے مؤثر طریقہ ہے، جو تجزیہ کے وقت کو گھنٹوں سے منٹوں تک کم کرتا ہے۔

Xcode Instruments میں Heap dump: Allocations اور Leaks

Xcode Instruments heap dump کے ساتھ کام کرنے کے لیے دو ٹول فراہم کرتا ہے: Allocations — ریئل ٹائم استعمال کے گراف کے ساتھ ہیپ ڈمپ کیپچر؛ Leaks — retain cycle تجزیہ کے ذریعے خودکار لیک تلاش۔ Allocations ہیپ میں تمام آبجیکٹس، ان کا سائز، تخلیقوں کی تعداد اور آزاد کرنے کی تعداد دکھاتا ہے۔ کسی مخصوص کلاس کے لیے تخلیقوں اور آزادیوں کی تعداد کے درمیان فرق ممکنہ لیک کی نشاندہی کرتا ہے۔

Allocations میں heap dump کیپچر Snapshot Memory بٹن سے کیا جاتا ہے — ٹول ایپلیکیشن کو روکتا ہے اور مکمل ڈمپ لیتا ہے۔ اس کے بعد، معیاری مناظر دستیاب ہیں: کلاس کے لحاظ سے آبجیکٹ کی فہرست، ہر آبجیکٹ کے لیے کال ٹری اور رپورٹ جنریٹر۔ Android Studio کے برعکس، Xcode .hprof استعمال نہیں کرتا، بلکہ ڈیٹا کو Instruments کے ساتھ مطابقت رکھنے والے اپنے .trace فارمیٹ میں محفوظ کرتا ہے۔

swift
// عام iOS لیک — closure کے ذریعے retain cycle
class NetworkManager {
    var onComplete: ((Data) -> Void)?

    func startRequest() {
        // ❌ Closure self کو کیپچر کرتا ہے — retain cycle
        onComplete = { data in
            self.process(data)
        }
    }
    func process(_ data: Data) {}
}

Leaks آلہ حوالہ گراف تجزیہ کے ذریعے retain cycles اور لیک کا خودکار طور پر پتہ لگاتا ہے۔ یہ لیک ہونے والے آبجیکٹس کو جامنی آئیکن سے نشان زد کرتا ہے اور جڑ (GC root) کا راستہ دکھاتا ہے۔ retain cycle کو ختم کرنے کے لیے، closure کیپچر میں [weak self] یا [unowned self] شامل کرنا کافی ہے۔ Swift استعمال کرنے والی ٹیموں میں Leaks آلے کا باقاعدہ چلنا CI پائپ لائن کا ایک لازمی مرحلہ ہے۔

swift
// اصلاح — self کا کمزور حوالہ
onComplete = { [weak self] data in
    guard let self else { return }
    self.process(data)
}

Shallow size، retained size اور dominator tree

Heap dump کے صحیح تجزیہ کے لیے تین اہم میٹرکس کو سمجھنا ضروری ہے۔ Shallow size وہ میموری ہے جو آبجیکٹ براہ راست گھیرتا ہے: اس کے فیلڈز، ہیڈر اور سیدھ۔ ایک عام Java/Kotlin آبجیکٹ کے لیے، shallow size 16–40 بائٹ ہوتا ہے۔ Retained size آبجیکٹ کا shallow size اور ان تمام آبجیکٹس کا کل shallow size ہے جو صرف اس آبجیکٹ کے ذریعے قابل رسائی ہیں۔ Retained size میموری کی کھپت پر آبجیکٹ کے حقیقی اثر کو ظاہر کرتا ہے۔

میٹرکتفصیلمثال
Shallow sizeآبجیکٹ کا اپنا سائز بائٹ میںBitmap (100×100) = 40 016 B
Retained sizeShallow size + جو کچھ رکھتا ہےView Tree کے ساتھ Activity = 2–5 MB
Deep sizeRetained size + دوسرے گرافس سے منسلک آبجیکٹایڈاپٹر کے ساتھ ScrollView = 10–50 MB

Dominator tree ایک ساخت ہے جہاں ہر آبجیکٹ اپنے «غالب» کی طرف اشارہ کرتا ہے — وہ آبجیکٹ جو اس کی رسائی کو کنٹرول کرتا ہے۔ اگر غالب کو ہٹا دیا جاتا ہے، تو اس کے ذیلی درخت کے تمام آبجیکٹ کوڑا بن جاتے ہیں۔ Dominator tree تجزیہ یہ جاننے کا تیز ترین طریقہ ہے کہ کون سا آبجیکٹ سب سے زیادہ میموری رکھتا ہے۔ Eclipse MAT کے مطابق، 90% لیک 5 منٹ میں top-20 dominator tree کا جائزہ لے کر دریافت کی جاتی ہیں۔

Heap dump کے ذریعے میموری لیک کا تجزیہ

Heap dump کے ذریعے لیک تجزیہ کا عمل کئی مراحل پر مشتمل ہے۔ مرحلہ 1: وہ کارروائی کریں جو میموری کو خالی کرے۔ مرحلہ 2: GC کو کال کریں اور heap dump لیں۔ مرحلہ 3: وہ آبجیکٹس تلاش کریں جو تباہ ہو جانے چاہیے تھے۔ مرحلہ 4: مشکوک آبجیکٹ کے لیے Path to GC Roots چلائیں — حوالہ جات کا سلسلہ جو آبجیکٹ کو زندہ رکھتا ہے۔ سلسلہ میں آخری حوالہ لیک کی وجہ ہے۔

Path to GC Roots

Path to GC Roots فنکشن Android Studio Profiler، Eclipse MAT اور Xcode Instruments میں دستیاب ہے۔ یہ GC جڑ سے مسئلہ آبجیکٹ تک حوالہ جات کا مختصر ترین سلسلہ دکھاتا ہے۔ کمزور اور نرم حوالہ جات کو خارج کرکے، آپ کو صرف مضبوط حوالہ جات ملتے ہیں — وہ جو واقعی جمع ہونے سے روکتے ہیں۔ Square Engineering کے مطابق، Android ایپس میں 70% لیک صرف دو نمونوں کی وجہ سے ہوتی ہیں: Activity یا Context کے جامد حوالہ جات اور رجسٹرڈ لیکن غیر رجسٹرڈ listeners۔

kotlin
// جامد حوالہ کے ذریعے لیک کی مثال
object AppCache {
    private val cache = mutableMapOf<String, Any>()

    fun storeActivityReference(activity: Activity) {
        cache["current_activity"] = activity // ❌ لیک!
    }
}

// اصلاح: کمزور حوالہ
object AppCacheFixed {
    private val cache = mutableMapOf<String, WeakReference<Any>>()
}

دو heap dumps کا موازنہ

موازنہ موڈ تکنیک لیک تلاش کرنے کے سب سے مؤثر طریقوں میں سے ایک ہے۔ بار بار کی جانے والی کارروائی سے پہلے اور بعد میں heap dump لیں۔ اہم کلاسز کی مثالوں کی تعداد کا موازنہ کریں: اگر تمام activity بند ہونے کے باوجود Activity کی تعداد بڑھ گئی ہے — یہ لیک ہے۔ Android Studio اور Eclipse MAT اختلافات کو نمایاں کرنے کے ساتھ خودکار ڈمپ موازنہ کی حمایت کرتے ہیں۔ Google کے مطابق، ڈمپ موازنہ جمع ہونے والے اثر کی وجہ سے واحد تجزیہ میں پوشیدہ لیک کو تلاش کرنے کی اجازت دیتا ہے۔

میموری کی کھپت کم کرنے کے لیے عملی سفارشات

حقیقی منصوبوں میں heap dump تجزیہ کی بنیاد پر، ثابت شدہ میموری اصلاح کے طریقے تیار کیے گئے ہیں۔ WeakReference استعمال کریں کیشز، کال بیکس اور طویل العمر آبجیکٹس میں سیاق و سباق کے حوالہ جات کے لیے۔ Listeners کو غیر رجسٹر کریں Android کے لیے onPause/onDestroy اور iOS کے لیے deinit میں۔ بڑے جامد مجموعوں سے بچیں — اگر ضروری ہو تو، سائز کی حد کے ساتھ LruCache استعمال کریں۔ Bitmap کو بہتر بنائیں: تصاویر کو صحیح inSampleSize کے ساتھ لوڈ کریں، ڈسک کیش کے ساتھ Glide یا Picasso استعمال کریں۔

ترقی کے دوران میموری پروفائلنگ

اپنی CI پائپ لائن میں باقاعدہ heap dump کیپچر شامل کریں۔ ایک ٹاسک ترتیب دیں جو سازوسامان والے UI ٹیسٹ چلاتا ہے، اہم صارف منظرنامے انجام دیتا ہے اور heap dump کا بیس لائن سے موازنہ کرتا ہے۔ اگر retained size بیس لائن سے 5% سے زیادہ بڑھ جاتا ہے، تو بلڈ کو رجعت کے طور پر نشان زد کیا جاتا ہے۔ یہ نقطہ نظر Airbnb، Uber اور اعلیٰ معیار کے تقاضوں والی دیگر کمپنیوں میں عمل کیا جاتا ہے۔ Uber Engineering کے مطابق، CI میں خودکار heap dump تجزیہ کے نفاذ نے ایک سہ ماہی میں میموری سے متعلقہ بگ کو 70% کم کیا۔

groovy
// CI میں خودکار heap dump کے لیے Gradle ٹاسک کی مثال
task profileMemory(type: Exec) {
    commandLine 'adb', 'shell',
        'am start -n com.example/.MainActivity'
    // لوڈ ہونے کا انتظار
    doLast {
        exec { commandLine 'adb', 'shell',
            'am broadcast -a com.example.DUMP_HEAP' }
    }
}

اکثر پوچھے گئے سوالات

Shallow size اور retained size میں کیا فرق ہے؟

Shallow size آبجیکٹ کا اپنا سائز ہے (فیلڈز + ہیڈر)۔ Retained size آبجیکٹ کا سائز اور ان تمام آبجیکٹس کا سائز ہے جو اسے ہٹانے پر کوڑا بن جائیں گے۔ Retained size میموری کی کھپت پر آبجیکٹ کے اثر کا بنیادی اشارہ ہے۔

فزیکل Android ڈیوائس پر heap dump کیسے کریں؟

Android Studio Profiler کے ذریعے، ڈیوائس اور عمل منتخب کریں، Dump Java Heap پر کلک کریں۔ متبادل — کمانڈ لائن کے ذریعے: adb shell am dumpheap PID /sdcard/dump.hprof، پھر adb pull۔

Heap dump بہت بڑا (500 MB+) کیوں ہو سکتا ہے؟

Heap dump میں تمام زندہ آبجیکٹس شامل ہوتے ہیں۔ اگر ایپلیکیشن کیشز، Bitmap یا بڑے ڈیٹا پر کارروائی کرتی ہے، تو ڈمپ سینکڑوں میگابائٹ تک پہنچ سکتا ہے۔ کلاس کے لحاظ سے فلٹر کریں یا صرف انڈیکس لوڈ کرنے کے لیے Eclipse MAT استعمال کریں۔

کیا Android Studio کے بغیر heap dump کا تجزیہ کیا جا سکتا ہے؟

ہاں، Eclipse MAT (Memory Analyzer Tool) استعمال کریں — .hprof فائلوں کے تجزیہ کے لیے ایک مفت ٹول۔ یہ dominator tree، path to GC roots، ڈمپ موازنہ اور Leak Suspects Report کے ذریعے خودکار لیک کا پتہ لگانے کی حمایت کرتا ہے۔

کیا heap dump ایپلیکیشن کی کارکردگی کو متاثر کرتا ہے؟

ڈمپ خود — ہاں، کیونکہ ڈمپ جمع کرنا تمام تھریڈ کو روکتا ہے (stop-the-world)۔ ڈمپ کے بغیر — نہیں۔ کنٹرول شدہ ماحول (ٹیسٹ بینچ، CI) میں ڈمپ لیں، پروڈکشن میں نہیں۔

خلاصہ

  • Heap Dump ایپلیکیشن ہیپ کا مکمل سنیپ شاٹ ہے جس میں ہر آبجیکٹ اور ان کے درمیان تعلقات کی معلومات ہوتی ہیں۔
  • Android Studio Memory Profiler اور Xcode Instruments Allocations بنیادی ڈمپ کیپچر ٹولز ہیں۔
  • Shallow size آبجیکٹ کا اپنا سائز ہے؛ retained size پورے انحصار ذیلی گراف سمیت آبجیکٹ کا سائز ہے۔
  • Dominator tree ان آبجیکٹس کو دکھاتا ہے جو سب سے زیادہ میموری کو کنٹرول کرتے ہیں۔
  • Path to GC Roots مضبوط حوالہ جات کا سلسلہ ہے جو کسی آبجیکٹ کو کوڑا کرکٹ جمع ہونے سے روکتا ہے۔
  • دو heap dumps کا موازنہ لیک کا پتہ لگانے کا سب سے قابل اعتماد طریقہ ہے۔
  • CI میں heap dump کیپچر اور تجزیہ کی آٹومیشن ترقی کے دوران میموری رجعت کو روکتی ہے۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں