หน่วยความจำเป็นทรัพยากรที่สำคัญและมีจำกัดในอุปกรณ์ที่ใช้พลังงานจาก 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 และการนำแคชของหน้าเว็บออก
โครงสร้างคู่มือ
คู่มือนี้จัดเป็นส่วนๆ ต่อไปนี้ ซึ่งออกแบบมาให้อ่านตามลำดับ
- แนวคิดพื้นฐาน: หลักการทางเทคนิคหลักของ หน่วยความจำ Android
- เครื่องมือประเมินอย่างรวดเร็ว: การใช้
meminfo,showmap, และprocstatsเพื่อการคัดกรองอย่างรวดเร็ว - การวิเคราะห์หน่วยความจำ Java: การเจาะลึก Java Heap ด้วย AHAT
- บิตแมปและหน่วยความจำ: ทำความเข้าใจว่ารูปภาพส่งผลต่อ RAM อย่างไร และการใช้เครื่องมือเพื่อสร้างโปรไฟล์รูปภาพ
- การวิเคราะห์หน่วยความจำเนทีฟ: การสร้างโปรไฟล์หน่วยความจำ C/C++ ด้วย
Perfetto และ
heapprofd - WebView และหน่วยความจำ: ทำความเข้าใจสถาปัตยกรรมแบบหลายกระบวนการและหน่วยความจำที่ใช้ของ WebView
- โค้ดแอปคือหน่วยความจำ: ทำความเข้าใจว่าการโหลดคลาสและการ ขยายขนาดของ Dex ส่งผลต่อ RAM อย่างไร
- เธรดและหน่วยความจำ: การวิเคราะห์ค่าใช้จ่ายของสแต็กเธรดเนทีฟ
- การเข้าถึงหน่วยความจำเฉพาะที่และประสิทธิภาพ: ทำความเข้าใจว่ารูปแบบการเข้าถึงข้อมูล ส่งผลต่อประสิทธิภาพของ CPU อย่างไร
- การผูกบริการและสถานะกระบวนการ: ทำความเข้าใจว่าการขึ้นต่อกันระหว่างกระบวนการส่งผลต่อคะแนน OOM อย่างไร
- การแก้ปัญหาทั่วทั้งระบบ: การตรวจสอบ PSI, LMK, การสลับ ZRAM และการนำแคชของหน้าเว็บออก
- การเรียกคืนหน่วยความจำ: การนำออกและการสลับ: ทำความเข้าใจ memcg,
การเรียกเก็บเงิน และการเรียกคืนเชิงรุกด้วย
memory.reclaim - การโต้ตอบระหว่าง kswapd และ lmkd: ทำความเข้าใจวิธีการทำงานร่วมกันของ kswapd และ lmkd ภายใต้แรงกดดัน
ข้อกำหนดเบื้องต้นและสภาพแวดล้อม
คู่มือนี้แสดงเวิร์กโฟลว์อ้างอิง ข้อมูลเกณฑ์มาตรฐาน และกรณีศึกษาที่แสดงวิธีวินิจฉัยและแก้ไขปัญหาหน่วยความจำของ Android
- เครื่องมือวิเคราะห์: เทคนิคในคู่มือนี้ใช้เครื่องมือประสิทธิภาพมาตรฐานของ
Android เป็นหลัก ซึ่งรวมถึง
Perfetto,
dumpsys meminfo,showmap, และ AHAT - สิทธิ์ระดับราก: เวิร์กโฟลว์การวินิจฉัยระดับระบบบางรายการ (เช่น
การตรวจสอบแรงกดดันของหน่วยความจำเคอร์เนลหรือตัวนับ PMU ของฮาร์ดแวร์) ต้องใช้
สิทธิ์ระดับรากที่ยกระดับ (
adb root) ในอุปกรณ์ userdebug หรือบิลด์ โปรแกรมจำลอง
เริ่มต้นที่นี่: แนวคิดพื้น2ฐาน