Middle+
როგორ გამოვავლინოთ მეხსიერების ნაკადის არსებობა დამის ანალიზისას?
sobes.tech AI
პასუხი AI-სგან
მეხსიერების გაჟონვის განსაზღვრისთვის დამპის (HPROF ფაილი) გამოყენებით ანალიზდება ობიექტების გრაფები ხის მეხსიერებაში. ძირითადი ნაბიჯები:
-
მეხსიერების დამპის მიღება:
- Android Studio Memory Profiler-ის საშუალებით.
- ბრძანებით
adb shell dumpheap <package_name> /data/local/tmp/dump.hprof. - სისტემური ზარის
Debug.dumpHprofData(filePath)გამოყენებით.
-
დამპის ანალიზი:
- დამპის გახსნა Android Studio-ში: Memory Profiler-ში ან მენიუდან "File" -> "Open".
- ობიექტების ანალიზი: ობიექტების სორტირება ზომის მიხედვით (Shallow Size, Retained Size) და მაგალითების რაოდენობით.
- შეუკითხავი ობიექტების ძიება: მოძებნეთ კლასები, რომლებიც უნდა განადგურდნენ (მაგალითად, Activity, Fragment, Contexts), მაგრამ აქვთ დიდი რაოდენობით მაგალითები ან მნიშვნელოვანი
Retained Size. - პуть ობიექტამდე (Reference Chain) კვლევა: შეარჩიეთ საეჭვო ობიექტი და ააგეთ მისი გზა ძირითადი ობიექტებისკენ (GC roots). ეს აჩვენებს, ვინ ინახავს ბმულს, რაც აფერხებს მტვრის შეგროვებას.
- სტატიკური ბმულების ძიება: სტატიკური ველები ხშირად წყაროა გაჟონვის, თუ ინახავს ხანგრძლივ ბმულებს კონტექსტებზე ან View-ებზე.
- LeakCanary-ის გამოყენება: ბიბლიოთეკა ავტომატურად იპოვის, დამპს და ანალიზს ახორციელებს გაჟონვებს რეალურ დროში, დეტალურ აღწერას აძლევს გაჟონვის გზაზე.
-
შედეგების ინტერპრეტაცია:
- გრძელი გზა GC root-ისკენ, რომელიც შეიცავს ბმულებს ობიექტებზე, რომლებიც უნდა განადგურდნენ, მიუთითებს პრობლემაზე.
- ბმულები სტატიკური ველებიდან, AsyncTask-ებიდან, Handler-ებიდან დაგვიანებებით, არასწორად გამორთული listener/callback-ებიდან ან singleton-ებიდან აქტივობებზე ან View-ებზე ხშირად არის გაჟონვის მიზეზი.
Android Studio Memory Profiler-ში GC root-ის გზის ანალიზის მაგალითი:
// GC root-ის გზა, რომელიც მიუთითებს გაჟონვაზე
// android.app.Activity მაგალითი mDestroyed=true
// ბმული android.widget.LinearLayout მაგალითი
// ბმული android.view.View $ListenerInfo მაგალითი
// ბმული com.example.MyActivity$1 მაგალითი (ანონიმური კლასი, რომელიც ახორციელებს View.OnClickListener-ს)
// ბმული com.example.MyActivity მაგალითი (გადმოყვანა ამ ბმულზე)
ამ მაგალითში, ანონიმური კლასი (ღილაკის დაჭერის მოსმენა) ინახავს უხილავ ბმულს MyActivity-ზე, მიუხედავად იმისა, რომ აქტივობა უკვე უნდა იყოს განადგურებული (mDestroyed=true). ეს მოსმენა, სავარაუდოდ, რეგისტრირებულია ან სხვა ხანგრძლივ ობიექტზე ინახება (მაგალითად, სტატიკური ველი ან სინგლტონი).