การใช้งานหน่วยความจำ (RSS แบบไม่ระบุตัวตน + Swap)

การใช้งานหน่วยความจำ (RSS แบบไม่ระบุตัวตน + Swap) เป็นเมตริกใน Android Vitals ที่แสดงการใช้งานหน่วยความจำของแอป

หน่วยความจำแบบไม่ระบุตัวตน คือหน่วยความจำที่ไม่ได้สำรองข้อมูลด้วยไฟล์ในพื้นที่เก็บข้อมูล เช่น การจัดสรรฮีปและหน่วยความจำที่จัดสรรด้วย mmap ซึ่งจะบันทึกการจัดสรรหน่วยความจำแบบไดนามิกของแอป รวมถึงฮีป Java หรือ Kotlin, การจัดสรรฮีปแบบเนทีฟที่ไม่ได้จัดการ (ซึ่งข้อมูลพิกเซลของ Bitmap อยู่ใน Android 8.0 (ระดับ API 26) ขึ้นไป) และสแต็กการดำเนินการของเทรด แม้ว่าระบบปฏิบัติการจะสามารถลดหน่วยความจำที่สำรองข้อมูลด้วยไฟล์ได้เมื่อหน่วยความจำมีไม่เพียงพอ แต่จะลดหน่วยความจำแบบไม่ระบุตัวตนไม่ได้

Resident Set Size (RSS) คือจำนวนหน้าหน่วยความจำทั้งหมด (ทั้งที่แชร์ และไม่แชร์) ที่กระบวนการใช้และเก็บไว้ใน RAM จริง ระบบจะถือว่าหน้าหน่วยความจำ "แชร์" หากมีกระบวนการมากกว่า 1 รายการเข้าถึง (เช่น แอปที่เข้าถึงไลบรารีเดียวกัน)

สำหรับหน่วยความจำแบบไม่ระบุตัวตน ระบบจะเขียนหน้าหน่วยความจำลงใน พื้นที่ Swap (หรือ zRAM ใน Android) ได้เมื่อหน่วยความจำมีไม่เพียงพอ และระบบจะอ่านหน้าหน่วยความจำเหล่านี้กลับจาก Swap ได้หากจำเป็น

โดยรวมแล้ว การใช้งานหน่วยความจำ (RSS แบบไม่ระบุตัวตน + Swap) คือการวัดจำนวนหน้าหน่วยความจำทั้งหมดของแอปที่ไม่ได้สำรองข้อมูลด้วยไฟล์ในพื้นที่เก็บข้อมูล ซึ่งรวมถึงหน่วยความจำที่ระบบเก็บไว้ใน Swap ด้วย การติดตาม RSS แบบไม่ระบุตัวตน + Swap จะช่วยให้คุณเห็นหน่วยความจำที่ใช้ที่แท้จริงของแอปซึ่งไม่สามารถนำออกได้

หากการใช้งานหน่วยความจำของแอปสูง ให้ตรวจสอบเพิ่มเติมและแก้ไขปัญหาโดยใช้คำแนะนำในหน้านี้

ระบุการใช้งานหน่วยความจำสูง

Android Vitals

Android Vitals จะแชร์การใช้งานหน่วยความจำของแอปที่แบ่งตามสถานะกระบวนการต่อไปนี้

  • เบื้องหน้า: กระบวนการของแอปแสดงอยู่ ค่า P99 สูงที่นี่มักจะส่งผลต่อประสิทธิภาพที่ผู้ใช้รับรู้ (การกระตุกหรือข้อขัดข้องเนื่องจากหน่วยความจำไม่เพียงพอ) และมีสาเหตุหลักมาจากคอมโพเนนต์หรือกิจกรรม UI ที่ไม่ได้นำออก
  • บริการที่ทำงานอยู่เบื้องหน้า: แอปกำลังเรียกใช้บริการที่ทำงานอยู่เบื้องหน้า เนื่องจากบริการเหล่านี้ออกแบบมาสำหรับงานที่ใช้เวลานาน จึงมีโอกาสสูงที่จะเกิดการรั่วไหลของวงจรการทำงานแบบสะสมซึ่งจะทำให้ค่า P99 สูงขึ้นอย่างรวดเร็วเมื่อเวลาผ่านไป
  • เบื้องหลัง: แอปกำลังเรียกใช้บริการที่ทำงานอยู่เบื้องหลัง หรือเพิ่งย้ายไปทำงาน เบื้องหลัง แต่ยังไม่ได้แคช นี่คือจุดที่การรั่วไหลของการประมวลผลเบื้องหลังจะเพิ่มขึ้น
  • แคช: แอปอยู่ในสถานะแคช สถานะนี้มีความไวสูงต่อการใช้หน่วยความจำของระบบ เช่น LMK เนื่องจากระบบปฏิบัติการสามารถนำสถานะกระบวนการนี้ออกได้ทุกเมื่อ เราจึงมีสถานะนี้ไว้เพื่อวัตถุประสงค์ในการแก้ไขข้อบกพร่องเท่านั้น

หากต้องการทำความเข้าใจว่าสถานะกระบวนการเหล่านี้สัมพันธ์กับ onTrimMemory Callback โปรดดูคำแนะนำเกี่ยวกับการ ปล่อยหน่วยความจำเพื่อตอบสนองต่อเหตุการณ์

นอกจากนี้ Android Vitals ยังแบ่งการใช้งานหน่วยความจำของแอปตามบัคเก็ต RAM ด้วย เมตริกการใช้งานหน่วยความจำจะแสดงเป็นไทม์ไลน์ของค่าเปอร์เซ็นไทล์รายวัน พร้อมกับค่ารายวันล่าสุดสำหรับเปอร์เซ็นไทล์ที่ 50 และ 90

เมื่อระบุค่าพื้นฐานของหน่วยความจำแล้ว ให้ทำตามคำแนะนำเพื่อ วินิจฉัยและปรับปรุงการใช้งานหน่วยความจำที่มากเกินไป

ระบุการรั่วไหลของหน่วยความจำโดยใช้การเบ้ของส่วนท้าย

หากต้องการช่วยระบุการรั่วไหลของหน่วยความจำ ให้มองหาความแตกต่างระหว่างผู้ใช้ทั่วไป (P50) กับผู้ใช้ส่วนท้าย (P90) ใน Android Vitals แม้ว่าการเพิ่มขึ้นของชิ้นงานทั่วไปจะทำให้หน่วยความจำเพิ่มขึ้นอย่างสม่ำเสมอในทุกเปอร์เซ็นไทล์ แต่การรั่วไหลของหน่วยความจำจะเพิ่มขึ้นเมื่อเวลาผ่านไป ซึ่งจะทำให้ข้อมูลส่วนท้ายเบ้ไปมาก

คุณควรเปรียบเทียบเมตริก P90 และ P99 กับค่าพื้นฐาน P50 ตามชื่อกระบวนการ หากอัตราส่วน P90 ต่อ P50 เกิน 3.5 เท่า แสดงว่าอาจมีหน่วยความจำรั่วไหลระหว่างเซสชันที่ยาวนาน ในบางกรณีการใช้งาน อัตราส่วนที่สูงขึ้นไม่ได้บ่งชี้ถึงการรั่วไหลเสมอไป แต่คุณควรประเมินเวิร์กโฟลว์ที่เฉพาะเจาะจงเพื่อดูว่าการใช้งานหน่วยความจำที่สูงขึ้นเป็นลักษณะการทำงานที่คาดไว้หรือไม่

แหล่งข้อมูล

วินิจฉัยการใช้งานหน่วยความจำที่มากเกินไปในเครื่อง

หากต้องการเริ่มต้นวินิจฉัยแหล่งที่มาของการใช้งานหน่วยความจำที่มากเกินไป คุณสามารถ บันทึกฮีปดัมพ์ด้วย บันทึกฮีปดัมพ์ ในการตั้งค่าสำหรับนักพัฒนาแอป, Android Studio หรือ Perfetto เราขอแนะนำให้คุณเริ่มด้วยการบันทึกฮีปดัมพ์ในเครื่องหลังจากทดสอบเส้นทางของผู้ใช้หลักของแอปแล้ว

เราขอแนะนำให้ทดสอบเส้นทางของผู้ใช้ต่อไปนี้เป็นพิเศษ

  • WebView และเซสชันเบราว์เซอร์ในแอป
  • การเลื่อนได้ไม่รู้จบที่มีสื่อจำนวนมาก
  • โฟลว์การสร้างและแก้ไขชิ้นงาน

หากต้องการตรวจสอบการรั่วไหลของหน่วยความจำที่อาจเกิดขึ้น ให้ระบุกระบวนการที่ใช้ทรัพยากรมากที่สุดก่อนโดยใช้ตารางชื่อกระบวนการ ในแดชบอร์ดการใช้งานหน่วยความจำของ Android Vitals จากนั้นเรียกใช้เส้นทางของผู้ใช้ที่เกี่ยวข้องในเครื่องและรวบรวมฮีปดัมพ์ในสถานะกระบวนการต่างๆ (แสดงอยู่ บริการที่ทำงานอยู่เบื้องหน้า และแคช) เพื่อตรวจสอบว่าแอปปล่อยหน่วยความจำหลังจากย้ายไปทำงานเบื้องหลังหรือไม่

หากคุณกำลังแก้ไขข้อบกพร่องของปัญหาหน่วยความจำโดยใช้ Android Studio Profiler คุณยังสามารถใช้การผสานรวม LeakCanary เพื่อปรับปรุงการตรวจหาการรั่วไหลและการตรวจหา Bitmap ที่ซ้ำกันเพื่อเพิ่มประสิทธิภาพการใช้งานรูปภาพ

หลังจากรวบรวมฮีปดัมพ์แล้ว เราขอแนะนำให้ใช้ ทักษะ AI ของ Perfetto เพื่อวิเคราะห์ฮีปดัมพ์และระบุแหล่งที่มาที่อาจทำให้การใช้งานหน่วยความจำสูง

ตัวอย่างการตอบกลับที่ทักษะ AI อาจให้ได้มีดังนี้

I have completed the analysis of memory leaks and bitmap issues for [app] using the provided Perfetto trace.
  Summary of Findings
  The investigation identified a critical memory pressure issue caused by massive bitmap retention within the app process.
...
Recommendations for [app]
   1. [Library] Image Cache Optimization:
       * Review the [Library] caching strategy. Ensure that bitmaps
         loaded for animations are released or downsampled when the animation is
         not in the foreground.
   2. Asset Resolution Audit:
       * The 14.7 MB average size suggests full-screen or extremely high-density assets. Audit the [library] files in the native_home component to ensure they are not using unnecessarily large source images.
   3. View Lifecycle Management:
       * Investigate why 21 [LibraryImage] instances are alive simultaneously. Ensure that views in the bottom
      tab are properly detached or their animations are cleared when switching between tabs.
   4. Fix Surface Leaks:
       * Address the Surface.release failures observed in the logs, as these can lead to both memory leaks and
         native resource exhaustion.

แหล่งข้อมูลเพิ่มเติมสำหรับการตีความฮีปดัมพ์

แหล่งข้อมูลต่อไปนี้มีข้อมูลเพิ่มเติมเกี่ยวกับการตีความฮีปดัมพ์และการแก้ไขข้อบกพร่องของการใช้งานหน่วยความจำ

  • การวิเคราะห์ด้วยตนเอง: ใช้คำแนะนำ Heap Dump Explorer ของ Perfetto เพื่อดูวิธีไปยังส่วนต่างๆ และตีความการแสดงภาพฮีปดัมพ์ใน UI ของ Perfetto
  • การจัดสรร Java/Kotlin: อ่าน การแสดงภาพฮีปดัมพ์ ART ครั้งแรก เพื่อดูคำแนะนำทีละขั้นตอนในการวิเคราะห์ฮีปดัมพ์ Android Runtime (ART)
  • การจัดสรรแบบเนทีฟ: โปรดดูเอกสารประกอบของ การทำโปรไฟล์แบบเนทีฟของ Perfetto เพื่อดูวิธีรวบรวมและวิเคราะห์โปรไฟล์หน่วยความจำแบบเนทีฟ (C/C++)
  • การตรวจสอบ CLI: ใช้ adb dumpsys meminfo เพื่อดูข้อมูลสรุปการใช้งานหน่วยความจำของแอปในอุปกรณ์อย่างรวดเร็ว
  • การวิเคราะห์ที่ใช้ AI ช่วย: ใช้ประโยชน์จาก ทักษะ AI ของ Perfetto เพื่อเรียกใช้การวิเคราะห์ที่ขับเคลื่อนโดย LLM เพื่อช่วยตรวจหาการรั่วไหลของหน่วยความจำและการจัดสรรที่มากเกินไปในการติดตาม
  • การวิเคราะห์ตาม SQL: ใช้ ทักษะ SQL และการวิเคราะห์การติดตามของ Perfetto เพื่อเรียกใช้การค้นหาที่มีโครงสร้างและสคริปต์เฉพาะทางเพื่อวิเคราะห์ข้อมูลการติดตามที่ซับซ้อน

ปรับปรุงการใช้งานหน่วยความจำ

โปรดดูส่วนต่อไปนี้เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการปรับปรุงการใช้งานหน่วยความจำของแอป

หากต้องการคำแนะนำโดยละเอียดเกี่ยวกับการแก้ไขปัญหาหน่วยความจำ โปรดดูคู่มือการจัดการหน่วยความจำของแอป