การใช้งานหน่วยความจำ (RSS แบบไม่ระบุตัวตน + Swap) เป็นเมตริกใน Android Vitals ที่แสดง การใช้งานหน่วยความจำของแอป
หน่วยความจำแบบไม่ระบุตัวตนคือหน่วยความจำที่ไม่ได้สำรองข้อมูลไว้ในไฟล์ในพื้นที่เก็บข้อมูล เช่น การจัดสรรฮีปและหน่วยความจำที่จัดสรร mmap ซึ่งจะบันทึกการจัดสรรหน่วยความจำแบบไดนามิกของแอป รวมถึงฮีป Java หรือ Kotlin, การจัดสรรฮีปที่มาพร้อมเครื่องที่ไม่ได้จัดการ (ที่ซึ่งข้อมูลพิกเซลของ Bitmap อยู่ใน Android 8.0 (ระดับ API 26) ขึ้นไป) และสแต็กการดำเนินการของเธรด แม้ว่าระบบปฏิบัติการจะทิ้งหน่วยความจำที่สำรองข้อมูลไว้ในไฟล์ได้ เมื่อมีหน่วยความจำไม่เพียงพอ แต่ก็ทิ้งหน่วยความจำที่ไม่ระบุชื่อไม่ได้
ขนาดชุดข้อมูลที่อยู่ในหน่วยความจำ (RSS) คือจำนวนหน้าหน่วยความจำทั้งหมด (ทั้งที่ใช้ร่วมกัน และไม่ได้ใช้ร่วมกัน) ที่กระบวนการใช้ซึ่งอยู่ใน RAM จริง ระบบจะถือว่าหน้าเว็บ "แชร์" หากมีกระบวนการมากกว่า 1 รายการเข้าถึงหน้าเว็บนั้น (เช่น แอปที่เข้าถึงไลบรารีเดียวกัน)
สำหรับหน่วยความจำที่ไม่ระบุชื่อ ระบบจะเขียนหน้าไปยังพื้นที่สวอป (หรือ zRAM ใน Android) เมื่อหน่วยความจำมีปริมาณน้อย ระบบสามารถอ่านหน้าเหล่านี้จากพื้นที่สวอปได้หากจำเป็น
โดยรวมแล้ว การใช้งานหน่วยความจำ (RSS แบบไม่ระบุตัวตน + Swap) เป็นการวัดจำนวนหน้าหน่วยความจำทั้งหมดของแอปที่ไม่ได้สำรองข้อมูลไว้ในไฟล์ในพื้นที่เก็บข้อมูล ซึ่งรวมถึงหน่วยความจำที่ระบบเก็บไว้ใน Swap ด้วย การติดตาม RSS แบบไม่ระบุตัวตน + swap ช่วยให้คุณเห็นหน่วยความจำที่ใช้ที่แท้จริงของแอปซึ่งไม่สามารถนำออกได้
หากการใช้งานหน่วยความจำของแอปสูง ให้ตรวจสอบเพิ่มเติมและแก้ไขปัญหา โดยใช้คำแนะนำในหน้านี้
ระบุการใช้งานหน่วยความจำสูง
Android Vitals
Android Vitals จะแชร์การใช้งานหน่วยความจำของแอปโดยแบ่งตามสถานะของกระบวนการต่อไปนี้
- เบื้องหน้า: กระบวนการของแอปจะปรากฏให้เห็น P99 สูงมักส่งผลต่อ ประสิทธิภาพที่ผู้ใช้รับรู้ (การกระตุกหรือข้อขัดข้องเนื่องจาก OOM) และมีสาเหตุหลักมาจากการ เก็บคอมโพเนนต์ UI หรือกิจกรรมที่ไม่จำเป็นอีกต่อไป
- บริการที่รับรู้ได้: กระบวนการของแอปทำงานในสถานะที่รับรู้ได้ ซึ่งรวมถึงบริการที่ทำงานอยู่เบื้องหน้า งานที่เร่งด่วน และงานการโอนข้อมูลที่เริ่มต้นโดยผู้ใช้ นอกจากนี้ยังอาจรวมถึงบริการที่เชื่อมโยงกับระบบหรือบริการที่เชื่อมโยงกับแอปอื่นๆ ด้วย เนื่องจากบริการเหล่านี้ออกแบบมาสำหรับงานที่ใช้เวลานาน การเก็บหน่วยความจำไว้เนื่องจากหน่วยความจำรั่วหรือการไม่ปล่อยทรัพยากรอาจทำให้ค่าเปอร์เซ็นไทล์ที่ 99 เพิ่มขึ้นเมื่อเวลาผ่านไป
- เบื้องหลัง: แอปกำลังเรียกใช้บริการที่ทำงานอยู่เบื้องหลัง หรือเพิ่งเข้าสู่เบื้องหลัง แต่ยังไม่ได้แคช ซึ่งเป็นจุดที่การประมวลผลในเบื้องหลังรั่วไหล และทรัพยากรที่ยังไม่ได้เผยแพร่สามารถเพิ่มขึ้นได้ เนื่องจากสถานะกระบวนการนี้มีความสำคัญน้อยกว่ากระบวนการที่ทำงานอยู่เบื้องหน้าหรือกระบวนการที่รับรู้ได้ คุณจึงควรหลีกเลี่ยงการเก็บหน่วยความจำจำนวนมากในสถานะนี้
- แคช: แอปอยู่ในสถานะแคช สถานะนี้มีความไวสูงต่อ แรงกดดันด้านหน่วยความจำของระบบ เช่น LMK เนื่องจากระบบปฏิบัติการสามารถลบสถานะกระบวนการนี้ได้ตามต้องการ เราจึงให้สถานะนี้ไว้เพื่อวัตถุประสงค์ในการแก้ไขข้อบกพร่องเท่านั้น
หากต้องการทำความเข้าใจว่าสถานะกระบวนการเหล่านี้มีความสัมพันธ์กับonTrimMemoryการเรียกกลับ
อย่างไร โปรดดูคำแนะนำเกี่ยวกับการปล่อยหน่วยความจำเพื่อตอบสนองต่อเหตุการณ์
Android Vitals ยังแบ่งการใช้งานหน่วยความจำของแอปตามกลุ่ม RAM ด้วย เมตริกการใช้งานหน่วยความจำจะแสดงเป็นไทม์ไลน์ของค่าเปอร์เซ็นไทล์รายวัน พร้อมกับค่ารายวันล่าสุดสำหรับเปอร์เซ็นไทล์ที่ 50 และ 90
เมื่อระบุเกณฑ์พื้นฐานของหน่วยความจำแล้ว ให้ทำตามคำแนะนำเพื่อวินิจฉัยและปรับปรุงการใช้งานหน่วยความจำมากเกินไป
ระบุหน่วยความจำรั่วโดยใช้ความเบ้ของส่วนท้าย
หากต้องการช่วยระบุหน่วยความจำรั่ว ให้มองหาความแตกต่างระหว่างผู้ใช้ทั่วไป (P50) และผู้ใช้ส่วนท้าย (P90) ใน Android Vitals แม้ว่าการเพิ่มขนาดของชิ้นงานทั่วไปจะทำให้หน่วยความจำเพิ่มขึ้นอย่างสม่ำเสมอในเปอร์เซ็นไทล์ทั้งหมด แต่หน่วยความจำรั่วจะเพิ่มขึ้นเมื่อเวลาผ่านไป ซึ่งทำให้ข้อมูลส่วนท้ายเบ้ไปมาก
คุณควรเปรียบเทียบเมตริก P90 และ P99 กับข้อมูลพื้นฐาน P50 ตามชื่อกระบวนการ หากอัตราส่วน P90 ต่อ P50 เกิน 3.5 เท่า แสดงว่ามีแนวโน้มที่จะเกิดหน่วยความจำรั่วไหล ในระหว่างเซสชันที่ยาวนาน สำหรับกรณีการใช้งานบางอย่าง อัตราส่วนที่สูงขึ้นไม่ได้บ่งบอกถึงการรั่วไหลเสมอไป แต่คุณควรประเมินเวิร์กโฟลว์ที่เฉพาะเจาะจงเพื่อพิจารณาว่าการใช้งานหน่วยความจำที่สูงขึ้นเป็นลักษณะการทำงานที่คาดไว้หรือไม่
แหล่งข้อมูล
วินิจฉัยการใช้หน่วยความจำมากเกินไปในเครื่อง
หากต้องการเริ่มวินิจฉัยแหล่งที่มาของการใช้หน่วยความจำมากเกินไป คุณสามารถ บันทึก Heap Dump ด้วยบันทึก Heap Dump ในการตั้งค่าสำหรับนักพัฒนาแอป, Android Studio หรือ Perfetto เราขอแนะนำให้คุณเริ่มด้วยการบันทึก ฮีปดัมพ์ในเครื่องหลังจากทดสอบเส้นทางของผู้ใช้หลักของแอป
เราขอแนะนำให้ทดสอบเส้นทางของผู้ใช้ต่อไปนี้เป็นพิเศษ
- WebView และเซสชันเบราว์เซอร์ในแอป
- การเลื่อนได้ไม่รู้จบที่มีสื่อจำนวนมาก
- ขั้นตอนการสร้างและแก้ไขชิ้นงาน
หากต้องการตรวจสอบหน่วยความจำรั่วไหลที่อาจเกิดขึ้น ให้ระบุกระบวนการที่ใช้หน่วยความจำมากที่สุดก่อนโดยใช้ตารางชื่อกระบวนการในแดชบอร์ดการใช้งานหน่วยความจำของ Android Vitals จากนั้น ให้เรียกใช้เส้นทางของผู้ใช้ที่เกี่ยวข้องในเครื่องและรวบรวม Heap Dump ในสถานะกระบวนการต่างๆ (มองเห็นได้ บริการที่ทำงานอยู่เบื้องหน้า และแคช) เพื่อตรวจสอบว่าแอปปล่อยหน่วยความจำหลังจากทำงานในเบื้องหลังหรือไม่
หากคุณกำลังแก้ไขข้อบกพร่องเกี่ยวกับหน่วยความจำโดยใช้ Android Studio Profiler คุณยังสามารถใช้การผสานรวม LeakCanary เพื่อเพิ่มประสิทธิภาพการตรวจหาหน่วยความจำรั่วและบิตแมปที่ซ้ำกันเพื่อเพิ่มประสิทธิภาพการใช้รูปภาพได้ด้วย
หลังจากรวบรวมฮีปดัมป์แล้ว เราขอแนะนำให้ใช้ Perfetto AI Skills เพื่อวิเคราะห์ฮีปดัมป์และระบุแหล่งที่มาที่อาจทำให้มีการใช้งานหน่วยความจำสูง
ตัวอย่างคำตอบที่ทักษะ 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
แหล่งข้อมูลต่อไปนี้มีข้อมูลเพิ่มเติมเกี่ยวกับการตีความฮีปดัมพ์ และการแก้ไขข้อบกพร่องของการใช้งานหน่วยความจำ
- การวิเคราะห์ด้วยตนเอง: ใช้คำแนะนำเกี่ยวกับ Perfetto Heap Dump Explorer เพื่อดูวิธีไปยังส่วนต่างๆ และตีความภาพการแสดงข้อมูลฮีปดัมป์ใน UI ของ Perfetto
- การจัดสรร Java/Kotlin: อ่านการแสดงภาพ Heap Dump ของ ART ครั้งแรกเพื่อดูคำแนะนำแบบทีละขั้นตอนในการวิเคราะห์ Heap Dump ของ Android Runtime (ART)
- การจัดสรรหน่วยความจำแบบเนทีฟ: โปรดอ่านเอกสารประกอบการสร้างโปรไฟล์เนทีฟของ Perfetto เพื่อดูวิธีรวบรวมและวิเคราะห์โปรไฟล์หน่วยความจำเนทีฟ (C/C++)
- การตรวจสอบ CLI: ใช้ adb dumpsys meminfo เพื่อดูรายละเอียดการใช้งานหน่วยความจำของแอปในอุปกรณ์อย่างรวดเร็ว
- การวิเคราะห์ที่ทำงานด้วยระบบ AI: ใช้ประโยชน์จาก Perfetto AI Skills เพื่อเรียกใช้การวิเคราะห์ที่ทำงานด้วย LLM เพื่อช่วยตรวจหาหน่วยความจำรั่วและการจัดสรรมากเกินไปในร่องรอย
- การวิเคราะห์ที่อิงตาม SQL: ใช้ Perfetto SQL และทักษะการวิเคราะห์การติดตามเพื่อเรียกใช้การค้นหาที่มีโครงสร้างและสคริปต์เฉพาะทางเพื่อวิเคราะห์ข้อมูลการติดตามที่ซับซ้อน
ปรับปรุงการใช้งานหน่วยความจำ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการปรับปรุงการใช้งานหน่วยความจำของแอปได้ในส่วนต่อไปนี้
- ลดร่องรอยของโค้ดและทรัพยากรของแอป
- ตรวจสอบหน่วยความจำที่พร้อมใช้งานและการใช้งานหน่วยความจำ
- ใช้โครงสร้างโค้ดที่มีประสิทธิภาพด้านหน่วยความจำมากขึ้น
โปรดดูคำแนะนำโดยละเอียดเกี่ยวกับการแก้ไขปัญหาหน่วยความจำในคู่มือจัดการหน่วยความจำของแอป