การใช้งานหน่วยความจำ (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 จากนั้นเรียกใช้เส้นทางของผู้ใช้ที่เกี่ยวข้องในเครื่องและรวบรวมฮีปดัมพ์ในสถานะกระบวนการต่างๆ (แสดงอยู่ บริการที่ทำงานอยู่เบื้องหน้า และแคช) เพื่อตรวจสอบว่าแอปปล่อยหน่วยความจำหลังจากย้ายไปทำงานเบื้องหลังหรือไม่
หลังจากรวบรวมฮีปดัมพ์แล้ว เราขอแนะนำให้ใช้ ทักษะ 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 เพื่อเรียกใช้การค้นหาที่มีโครงสร้างและสคริปต์เฉพาะทางเพื่อวิเคราะห์ข้อมูลการติดตามที่ซับซ้อน
ปรับปรุงการใช้งานหน่วยความจำ
โปรดดูส่วนต่อไปนี้เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการปรับปรุงการใช้งานหน่วยความจำของแอป
- ลดขนาดโค้ดและทรัพยากรของแอป
- ตรวจสอบหน่วยความจำที่ใช้ได้และการใช้งานหน่วยความจำ
- ใช้โครงสร้างโค้ดที่มีประสิทธิภาพด้านหน่วยความจำมากขึ้น
หากต้องการคำแนะนำโดยละเอียดเกี่ยวกับการแก้ไขปัญหาหน่วยความจำ โปรดดูคู่มือการจัดการหน่วยความจำของแอป