Memory Leaking

memory leak နှင့် ပတ်သက်၍ သိကောင်းစရာ
ရေးသားသူ : ဇော်မင်းစိုး

ဒီတစ်လတော့ ကျွန်တော်ပြောမဲ့ အကြောင်းအရာကတော့ iOS App တွေကို Development လုပ်တဲ့အခါမှာ အရေးကြီးတဲ့ အပိုင်းတစ်ခု ဖြစ်တဲ့ Memory Leaking ပိုင်းကို ပြောသွားမှာဖြစ်ပါတယ်။

တစ်လချင်းစီမှာ Instrument ရဲ့ Tools တွေကို ဘယ်လို ဘယ်ပုံ အသုံးပြုကြမလဲ ဆိုတာ ဆက်လက်ပြီး ပြောပေးသွားမှာ ဖြစ်ပါတယ်။

ကိုယ်ရေးထားတဲ့ App ဟာ Memory Leak ဖြစ်နေတယ်ဆိုရင် Device ရဲ့ Memory တွေကိုမလိုအပ်ပဲနဲ့ ဖြုန်းသလိုဖြစ်နေပြီးတော့ App ရဲ့ Performace ကိုလည်းကျဆင်းစေပါတယ်။

အခန့်မသင့်လို့ Memory Leak ဖြစ်တာများလာပြီဆိုရင်တော့ iOS က ကိုယ့်ရဲ့ App ကို Kill လုပ်ပစ်လိုက်တဲ့အခါမှာ ကိုယ့် App က Crash ဖြစ်ပြီး ထွက်သွား တတ်ပါတယ်။

ဒါ့ကြောင့်မို့လို့ ကိုယ့်ရဲ့ iOS App လေးကို Development လုပ်နေတုန်းမှာ Memory Leak ရှိမရှိကို စစ်ဆေးလို့ရတဲ့ XCode မှာပါတဲ့ Instrument Tool လေးအသုံးပြုပုံလေးတွေကို ဖော်ပြပေးသွားမှာဖြစ်ပါတယ်။

အရင်ဆုံး XCode ကိုဖွင့်ပြီး Project တစ်ခုဆောက်လိုက်ပါ။

Project ဆောက်တဲ့နေရာမှာ Use Automatic Reference Counting ကို UnCheck လုပ်ပေးလိုက်ပါ။ပြီးရင် ကိုယ်ကြိုက်တဲ့နာမည်ပေးပြီးတော့ အောက်က Code လေးတွေကို UIButton နဲ့ Action ချိတ်ပေးလိုက်ပါ။

- (IBAction)checkMemory:(id)sender {
while (true)
{
NSNumber *i = [[NSNumber alloc] initWithLong:1000];
NSLog(@"Count is %d",[i retainCount]);
}
}

ပြီးရင် အပေါ်က Menu Bar မှာ Product > Profile ကိုရွေးပေးလိုက်ပါက Instruments App တက်လာမှာဖြစ်ပါတယ်။

ပြီးရင် ကိုယ့် App ကို စမ်းဖို့ ဘယ်အရာစမ်းမှာလဲဆိုပြီး အောက်က ပုံလေးအတိုင်းလေး မေးပါလိမ့်မယ်။

အဲ့ဒီအခါမှာ Leaks ကိုရွေးပေးလိုက်ပါ။

ရွေးပေးလိုက်ပါက ကိုယ့် App လေးကို Run ပါလိမ့်မယ်။ ပြီးရင် စောစောက ကျွန်တော်တို့ ရေးထားတဲ့ Code လေးနဲ့ချိတ်ထားတဲ့ Button လေးကိုနှိပ်လိုက်ရင် Memory Leak ဖြစ်ကြောင်းကို ပြတဲ့ အနီရောင်အတန်းလေးတွေကို တက်လာပါလိမ့်မယ်။

အဲ့ဒါဆိုရင် ကျွန်တော်တို့ App လေးမှာ Memory Leak ဖြစ်နေပြီလို့တွေ့ရှိရပါတယ်။

အခုကျွန်တော်တို့စမ်းနေတာက ARC ကို Disable လုပ်ထားပြီး စမ်းသပ်နေတာ ဖြစ်ပါတယ်။

အခုနောက်ပိုင်း App တွေမှာတော့ ARC နဲ့ရေးကြတာများပါတယ်။ကျွန်တော်ကိုယ်တိုင်လည်း ARC ကိုပဲသုံးပြီးရေးလေ့ရှိပါတယ်။

ဒါပေမဲ့ Memory Leaking ပိုင်းကိုတော့ သဘောပေါက်ထားသင့်ပါတယ်။

ဒါဆိုရင် ဘယ်နေရာက Memory Leaking ဖြစ်နေတာလဲဆိုတာသိရအောင် Instrument ထဲက Menu Bar မှာ View > Extended Detail ကိုဖွင့်ကြည့်လိုက်ရင် ညာဘက်မှာ Memory Leak ဖြစ်တဲ့နေရာကို Bold နဲ့ပြထားတာကိုတွေ့ရပါလိမ့်မယ်။

အဲ့ဒါကို Double Click နှိပ်လိုက်ရင် ဘယ် Code က Memory Leaking ဖြစ်စေလည်းဆိုတာကို ပြပါလိမ့်မယ်။

ဒါဆိုရင် ကျွန်တော်တို့ရေးထားတဲ့ Code လေးမှာ Memory Leaking ဖြစ်နေတယ်ဆိုပြီး အနီရောင်လေး နဲ့လာပြနေမှာ ဖြစ်ပါတယ်။

အဲ့ဒီ Memory Leaking ဖြစ်စေတဲ့ Code လေးကို အောက်ကလို ပြောင်းရေးပေးလိုက်ပါ။

- (IBAction)checkMemory:(id)sender {
while (true)
{
NSNumber *i = [[NSNumber alloc] initWithLong:1000];
NSLog(@"Count is %d",[i retainCount]);
[i release];
}
}

ပြီးရင် ပြန်စမ်းသပ်ကြည့်လိုက်တဲ့အခါမှာ Memory Leak မဖြစ်တော့တာတွေ့ရပါလိမ့်မယ်။

ဘာကြောင့်လဲဆိုတော့ [i release]; ဆိုတဲ့ Code လေးကိုရေးပေးလိုက်တဲ့အတွက်ကြောင့် allocation လုပ်တဲ့အခါမှာ retain Count တစ်ခါတိုးပြီးတိုင်း တစ်ခါ release လုပ်လိုက်တဲ့ အတွက်ကြောင့် Memory Leaking မဖြစ်တော့တာကို တွေ့ရမှာဖြစ်ပါတယ်။

ဒီနေရာမှာကျွန်တော် ပြောချင်တာကတော့ ARC မသုံးဘူးဆိုရင် release ကိုသတိထားပြီး လုပ်ပေးနေရမှာဖြစ်ပါတယ်။

မဟုတ်ရင်တော့ ကိုယ်ဆောက်ထားတဲ့ Object ဟာ Memory ပေါ်မှာ ကျန်ရှိနေတဲ့အခါမှာ Memory Leaking ဖြစ်ပြီး App ကိုထိခိုက်စေနိုင်ပါတယ်။

အခုဆက်ပြောမှာကတော့ Instrument ထဲက Memory Leaking ထဲမှာပါတဲ့ အကြောင်းအရာတစ်ချို့ ကို အသေးစိတ် ရှင်းလင်း ပေးသွားမှာ ဖြစ်ပါတယ်။

Graph : ဒီဟာလေးကတော့ အမှန်ခြစ်ထားတဲ့ Category တွေကိုအပေါ်က Chart မှာပြပေးမှာဖြစ်ပါတယ်။

Category : Category ကတော့ လက်ရှိ ကိုယ့် App မှာ Run နေတဲ့ Core Foundation Object List တွေ Objective-C Class တွေကိုဖော်ပြပေးထားတာပါ။

Live Bytes : Live Bytes ကတော့ လက်ရှိ ကိုယ့်ရဲ့ App လေးဟာ iOS Device ရဲ့ Memory ကို ဘယ်လောက် ယူသုံးထားသလဲ ဆိုတာ ပြပေးနေတာပါ။

Living : Living ကတော့ Memory ရဲ့ Heap ပေါ်မှာတည်ဆောက်ထားတဲ့ Object အရေအတွက်ကို ဖော်ပြပေးထားတာပါ။

Transitory : Transitory ကတော့ Memory ပေါ်မှာ တည်ဆောက်ခဲ့တဲ့ ၊ ဖျက်သိမ်းခဲ့တဲ့ Object အရေအတွက်ကို ဖော်ပြပေးထားတာပါ။

Overall Bytes : Overall Bytes ကတော့ ကိုယ့် App စ Run ကတည်းက အသုံးပြုထားတဲ့ Object တွေရဲ့ Bytes အရေအတွက် စုစုပေါင်းကိုဖော်ပြပေးထားတာပါ။Release လုပ်ထားတဲ့ Bytes အရေအတွက်တွေပါ ပါပါတယ်.

Overall : Overall ကတော့ ကိုယ့် App စ Run ကတည်းက တည်ဆောက်ခဲ့တဲ့ Object အရေအတွက် စုစုပေါင်းကို ဖော်ပြပေးထားတာ ဖြစ်ပါတယ်။ Release လုပ်ခဲ့တဲ့ အရေအတွက် တွေပါ ပါဝင်ပါတယ်။

Allocations (Net / Overall) : ဒါကတော့ ကိုယ့် App ရဲ့ Memory ပေါ်မှာ နေရာယူမှု Total ကိုဖော်ပြပေးထားတာဖြစ်ပါတယ်။

ဒါဆိုရင် ဒီတစ်လအတွက်တော့ ကျွန်တော် Memory Management ပိုင်းကို စစ်ဆေးလို့ရတဲ့ Instrument ရဲ့ Memory Leak ကိုဖော်ပြပေးပြီး သွားတဲ့ အခါမှာတော့ နောက်လထဲမှာလည်း Instrument ရဲ့ ထူးခြားတဲ့ Tool အသုံးပြုပုံလေးတွေကို ဆက်လက်ဖော်ပြ ပေးသွားမှာ ဖြစ်ပါတယ်။