การใช้งานหน่วยความจำ (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 อย่างไร โปรดดูคำแนะนำเกี่ยวกับการปล่อยหน่วยความจำเพื่อตอบสนองต่อเหตุการณ์

นอกจากนี้ 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 ที่ซ้ำกันเพื่อเพิ่มประสิทธิภาพการใช้งานรูปภาพได้ด้วย

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

ตัวอย่างการตอบกลับของ AI Skills

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.

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

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

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

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

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

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