ทำความเข้าใจและแก้ปัญหาเกี่ยวกับหน่วยความจำของ Android

หน่วยความจำเป็นทรัพยากรที่สำคัญและมีจำกัดในอุปกรณ์ที่ใช้พลังงานจาก Android ในฐานะนักพัฒนาแพลตฟอร์ม Android หรือ OEM การทำความเข้าใจวิธีการทำงานของหน่วยความจำในทุกระดับ ตั้งแต่รันไทม์ Java ไปจนถึงเคอร์เนล Linux เป็นสิ่งสำคัญสำหรับการสร้างระบบที่มีประสิทธิภาพและเสถียร

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

วัตถุประสงค์

หลังจากอ่านคู่มือนี้จบแล้ว คุณจะสามารถทำสิ่งต่อไปนี้ได้

  • อธิบายแนวคิดพื้นฐานของหน่วยความจำ Android ซึ่งรวมถึงโมเดลกระบวนการ Zygote และไฟล์ที่แมปกับหน่วยความจำ
  • แยกความแตกต่างระหว่างขนาดชุดข้อมูลที่อยู่ในหน่วยความจำ (Resident Set Size หรือ RSS), ขนาดชุดข้อมูลตามสัดส่วน (Proportional Set Size หรือ PSS) และขนาดชุดข้อมูลที่ไม่ซ้ำกัน (Unique Set Size หรือ USS)
  • ใช้เครื่องมือบรรทัดคำสั่งมาตรฐาน เช่น dumpsys meminfo และ showmap เพื่อประเมินการใช้งานหน่วยความจำอย่างรวดเร็ว
  • จับภาพและวิเคราะห์ Java Heap Dump โดยใช้ AHAT เพื่อค้นหาการรั่วไหลและการจัดสรรที่มากเกินไป
  • ใช้ Perfetto และ heapprofd เพื่อสร้างโปรไฟล์หน่วยความจำทั้ง Java และเนทีฟทั่วทั้งระบบ
  • ทำความเข้าใจตัวบ่งชี้แรงกดดันของหน่วยความจำทั่วทั้งระบบ เช่น ข้อมูลการหยุดทำงานเนื่องจากแรงกดดัน (Pressure Stall Information หรือ PSI) และตรวจสอบกิจกรรมของ Low Memory Killer (LMK)
  • สังเกตกิจกรรมการเรียกคืนระดับเคอร์เนล ซึ่งรวมถึงการสลับ ZRAM และการนำแคชของหน้าเว็บออก

โครงสร้างคู่มือ

คู่มือนี้จัดเป็นส่วนๆ ต่อไปนี้ ซึ่งออกแบบมาให้อ่านตามลำดับ

  1. แนวคิดพื้นฐาน: หลักการทางเทคนิคหลักของ หน่วยความจำ Android
  2. เครื่องมือประเมินอย่างรวดเร็ว: การใช้ meminfo, showmap, และ procstats เพื่อการคัดกรองอย่างรวดเร็ว
  3. การวิเคราะห์หน่วยความจำ Java: การเจาะลึก Java Heap ด้วย AHAT
  4. บิตแมปและหน่วยความจำ: ทำความเข้าใจว่ารูปภาพส่งผลต่อ RAM อย่างไร และการใช้เครื่องมือเพื่อสร้างโปรไฟล์รูปภาพ
  5. การวิเคราะห์หน่วยความจำเนทีฟ: การสร้างโปรไฟล์หน่วยความจำ C/C++ ด้วย Perfetto และ heapprofd
  6. WebView และหน่วยความจำ: ทำความเข้าใจสถาปัตยกรรมแบบหลายกระบวนการและหน่วยความจำที่ใช้ของ WebView
  7. โค้ดแอปคือหน่วยความจำ: ทำความเข้าใจว่าการโหลดคลาสและการ ขยายขนาดของ Dex ส่งผลต่อ RAM อย่างไร
  8. เธรดและหน่วยความจำ: การวิเคราะห์ค่าใช้จ่ายของสแต็กเธรดเนทีฟ
  9. การเข้าถึงหน่วยความจำเฉพาะที่และประสิทธิภาพ: ทำความเข้าใจว่ารูปแบบการเข้าถึงข้อมูล ส่งผลต่อประสิทธิภาพของ CPU อย่างไร
  10. การผูกบริการและสถานะกระบวนการ: ทำความเข้าใจว่าการขึ้นต่อกันระหว่างกระบวนการส่งผลต่อคะแนน OOM อย่างไร
  11. การแก้ปัญหาทั่วทั้งระบบ: การตรวจสอบ PSI, LMK, การสลับ ZRAM และการนำแคชของหน้าเว็บออก
  12. การเรียกคืนหน่วยความจำ: การนำออกและการสลับ: ทำความเข้าใจ memcg, การเรียกเก็บเงิน และการเรียกคืนเชิงรุกด้วย memory.reclaim
  13. การโต้ตอบระหว่าง kswapd และ lmkd: ทำความเข้าใจวิธีการทำงานร่วมกันของ kswapd และ lmkd ภายใต้แรงกดดัน

ข้อกำหนดเบื้องต้นและสภาพแวดล้อม

คู่มือนี้แสดงเวิร์กโฟลว์อ้างอิง ข้อมูลเกณฑ์มาตรฐาน และกรณีศึกษาที่แสดงวิธีวินิจฉัยและแก้ไขปัญหาหน่วยความจำของ Android

  • เครื่องมือวิเคราะห์: เทคนิคในคู่มือนี้ใช้เครื่องมือประสิทธิภาพมาตรฐานของ Android เป็นหลัก ซึ่งรวมถึง Perfetto, dumpsys meminfo, showmap, และ AHAT
  • สิทธิ์ระดับราก: เวิร์กโฟลว์การวินิจฉัยระดับระบบบางรายการ (เช่น การตรวจสอบแรงกดดันของหน่วยความจำเคอร์เนลหรือตัวนับ PMU ของฮาร์ดแวร์) ต้องใช้ สิทธิ์ระดับรากที่ยกระดับ (adb root) ในอุปกรณ์ userdebug หรือบิลด์ โปรแกรมจำลอง

เริ่มต้นที่นี่: แนวคิดพื้น2ฐาน