Sobes.tech
Middle+

როგორ გამოვავლინოთ მეხსიერების ნაკადის არსებობა დამის ანალიზისას?

sobes.tech AI

პასუხი AI-სგან

მეხსიერების გაჟონვის განსაზღვრისთვის დამპის (HPROF ფაილი) გამოყენებით ანალიზდება ობიექტების გრაფები ხის მეხსიერებაში. ძირითადი ნაბიჯები:

  1. მეხსიერების დამპის მიღება:

    • Android Studio Memory Profiler-ის საშუალებით.
    • ბრძანებით adb shell dumpheap <package_name> /data/local/tmp/dump.hprof.
    • სისტემური ზარის Debug.dumpHprofData(filePath) გამოყენებით.
  2. დამპის ანალიზი:

    • დამპის გახსნა Android Studio-ში: Memory Profiler-ში ან მენიუდან "File" -> "Open".
    • ობიექტების ანალიზი: ობიექტების სორტირება ზომის მიხედვით (Shallow Size, Retained Size) და მაგალითების რაოდენობით.
    • შეუკითხავი ობიექტების ძიება: მოძებნეთ კლასები, რომლებიც უნდა განადგურდნენ (მაგალითად, Activity, Fragment, Contexts), მაგრამ აქვთ დიდი რაოდენობით მაგალითები ან მნიშვნელოვანი Retained Size.
    • პуть ობიექტამდე (Reference Chain) კვლევა: შეარჩიეთ საეჭვო ობიექტი და ააგეთ მისი გზა ძირითადი ობიექტებისკენ (GC roots). ეს აჩვენებს, ვინ ინახავს ბმულს, რაც აფერხებს მტვრის შეგროვებას.
    • სტატიკური ბმულების ძიება: სტატიკური ველები ხშირად წყაროა გაჟონვის, თუ ინახავს ხანგრძლივ ბმულებს კონტექსტებზე ან View-ებზე.
    • LeakCanary-ის გამოყენება: ბიბლიოთეკა ავტომატურად იპოვის, დამპს და ანალიზს ახორციელებს გაჟონვებს რეალურ დროში, დეტალურ აღწერას აძლევს გაჟონვის გზაზე.
  3. შედეგების ინტერპრეტაცია:

    • გრძელი გზა 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). ეს მოსმენა, სავარაუდოდ, რეგისტრირებულია ან სხვა ხანგრძლივ ობიექტზე ინახება (მაგალითად, სტატიკური ველი ან სინგლტონი).