Low Memory Killer (LMK) Daemon ของ Android จะตรวจสอบสถานะหน่วยความจำของระบบ Android ที่ทำงานอยู่ และตอบสนองต่อการใช้หน่วยความจำสูงด้วยการสิ้นสุดกระบวนการที่จำเป็นน้อยที่สุด Android Vitals จะติดตามและรายงานการสิ้นสุด LMK ที่ผู้ใช้รับรู้ใน Google Play Console เพื่อช่วยคุณระบุปัญหาแรงกดดันของหน่วยความจำที่ส่งผลต่อผู้ใช้
เมตริก LMK ใน Android Vitals
Android Vitals ช่วยให้คุณตรวจสอบและปรับปรุงอัตรา LMK ของแอปได้ Android Vitals จะวัดอัตรา LMK เพียงอัตราเดียว นั่นคืออัตรา LMK ที่ผู้ใช้รับรู้
เมตริกนี้แสดงเปอร์เซ็นต์ของผู้ใช้ที่ใช้งานอยู่รายวันซึ่งพบ LMK ที่ผู้ใช้รับรู้อย่างน้อย 1 ครั้ง LMK ที่ผู้ใช้รับรู้คือ LMK ที่ผู้ใช้มีแนวโน้มที่จะสังเกตเห็นได้ ตัวอย่างเช่น LMK ที่เกิดขึ้นระหว่างที่แอปแสดงกิจกรรมหรือทำหน้าที่เป็นบริการที่ทำงานอยู่เบื้องหน้า การสิ้นสุดเหล่านี้ส่งผลให้กระบวนการออกทันทีโดยไม่เป็นไปตามปกติ สำหรับผู้ใช้ปลายทาง จะดูเหมือนว่าแอปขัดข้อง ซึ่งมักจะข้ามกลไกการบันทึกสถานะวงจรมาตรฐานและส่งผลให้ความคืบหน้าของผู้ใช้หายไป
Android Vitals มุ่งเน้นที่การสิ้นสุดกระบวนการเหล่านี้เนื่องจากเป็นพร็อกซีที่มีความแม่นยำสูงสำหรับปัญหาการจัดการหน่วยความจำที่ไม่ถูกต้อง อัตรา LMK ที่สูงกว่า 1% บ่งชี้ว่าจำเป็นต้องดำเนินการทันที อย่างไรก็ตาม อัตรา LMK ที่ต่ำกว่าไม่ได้หมายความว่าการใช้งานหน่วยความจำของแอปจะอยู่ในเกณฑ์ดีเสมอไป อัตราที่ต่ำลงนั้นอาจหมายความว่า Daemon ของ LMK กำลังปิดกระบวนการบ่อยครั้งขณะที่กระบวนการเหล่านั้นทำงานอยู่เบื้องหลัง ซึ่งจะลดประสิทธิภาพของ "การเริ่มต้นแบบอุ่นเครื่อง" และความลื่นไหลของการทำงานหลายอย่างพร้อมกัน
คุณดูเมตริกนี้ได้ในส่วนความเสถียรใน Android Vitals โดยทำดังนี้
คุณสามารถกรองเมตริก เปรียบเทียบเมตริกกับแอปเทียบเท่า หรือติดตามการเปลี่ยนแปลงของเมตริกเป็นระยะเวลานาน (สูงสุด 3 ปี) ได้เช่นเดียวกับเมตริก Vitals หลักที่คล้ายกัน เช่น ANR และข้อขัดข้อง ข้อมูลจะพร้อมใช้งานสำหรับแอปที่มีอยู่ตั้งแต่วันที่ 28 ม.ค. 2025 เป็นต้นไป
วิธีการทำงานของ Low Memory Killer Daemon
แพลตฟอร์ม Android ทำงานบนสมมติฐานที่ว่าหน่วยความจำที่ว่างอยู่คือหน่วยความจำที่สูญเปล่า Android พยายามใช้หน่วยความจำทั้งหมดที่มีอยู่ตลอดเวลา ตัวอย่างเช่น ระบบจะเก็บแอปไว้ในหน่วยความจำหลังจากปิดแอปไปแล้ว เพื่อให้ผู้ใช้สลับกลับไปใช้แอปได้อย่างรวดเร็ว ด้วยเหตุนี้ อุปกรณ์ Android จึงมักทำงานโดยมีหน่วยความจำว่างน้อยมาก (ดูการจัดสรรหน่วยความจำระหว่างกระบวนการต่างๆ)
ในการตัดสินใจว่าจะหยุดกระบวนการใดเมื่อหน่วยความจำที่ใช้ได้เหลือน้อย Low Memory Killer (LMK) Daemon จะใช้คะแนนหน่วยความจำไม่เพียงพอที่เรียกว่า oom_adj_score เพื่อจัดลำดับความสำคัญของกระบวนการที่ทำงานอยู่ ระบบจะปิดกระบวนการที่มีคะแนนสูงก่อน ระบบจะปิดแอปที่ทำงานอยู่เบื้องหลังก่อน แล้วจึงปิดกระบวนการของระบบเป็นลำดับสุดท้าย ตารางต่อไปนี้แสดงหมวดหมู่การให้คะแนน LMK จากสูงไปต่ำ
ระบบจะกำจัดรายการในหมวดหมู่ที่มีคะแนนสูงสุดในแถวที่ 1 ก่อน ดังนี้
เครื่องมือวิเคราะห์การใช้หน่วยความจำ
เครื่องมือต่อไปนี้จะช่วยคุณค้นหาและวิเคราะห์ปัญหาเกี่ยวกับหน่วยความจำได้ด้วยวิธีต่อไปนี้
- ดูวิธีที่แอปจัดสรรหน่วยความจำเมื่อเวลาผ่านไป คุณจะเห็นกราฟแบบเรียลไทม์ ที่แสดงปริมาณหน่วยความจำที่แอปใช้ จำนวนออบเจ็กต์ Java ที่จัดสรร และเวลาที่เกิดการรวบรวมขยะ
- เริ่มเหตุการณ์การเก็บขยะและถ่ายภาพสแนปชอตของฮีป Java ขณะที่แอปทำงาน
- บันทึกการจัดสรรหน่วยความจำของแอป ตรวจสอบออบเจ็กต์ที่จัดสรรทั้งหมด และดูสแต็กเทรซสำหรับการจัดสรรแต่ละรายการ
หากเกมทำงานบนเครื่องมือแบบเนทีฟ ให้ใช้ HWAddress Sanitizer เพื่อแก้ไขข้อบกพร่องในการจัดสรรหน่วยความจำแบบเนทีฟ
เครื่องมือสร้างโปรไฟล์หน่วยความจำของ Android Studio
Android Studio มีเครื่องมือสร้างโปรไฟล์หน่วยความจำเป็นคอมโพเนนต์ของเครื่องมือสร้างโปรไฟล์ Android ซึ่งช่วยคุณระบุหน่วยความจำรั่วไหลและการเสียหน่วยความจำที่อาจทำให้เกิดการกระตุก ค้าง และแม้แต่แอปขัดข้อง เครื่องมือวิเคราะห์จะแสดงกราฟการใช้หน่วยความจำของแอปแบบเรียลไทม์ และช่วยให้คุณบันทึกฮีปดัมป์, บังคับให้เก็บขยะ และติดตามการจัดสรรหน่วยความจำได้
เครื่องมือสร้างโปรไฟล์หน่วยความจำของ Unity
หากใช้ Unity Engine เพื่อสร้างแอป คุณสามารถทำตามคำแนะนำในการทำโปรไฟล์หน่วยความจำของ Unity Unity มีเครื่องมือ 2 อย่างในการวิเคราะห์การใช้งานหน่วยความจำในแอปพลิเคชันใน Unity
เครื่องมือแรกคือโมดูลเครื่องมือสร้างโปรไฟล์หน่วยความจำ ซึ่งเป็นเครื่องมือสร้างโปรไฟล์ในตัวที่ให้ข้อมูลพื้นฐานเกี่ยวกับตำแหน่งที่แอปพลิเคชันใช้หน่วยความจำ
เครื่องมือที่ 2 คือแพ็กเกจเครื่องมือสร้างโปรไฟล์หน่วยความจำ ซึ่งเป็นแพ็กเกจ Unity ที่คุณเพิ่มลงในโปรเจ็กต์ได้ แพ็กเกจจะเพิ่มหน้าต่างเครื่องมือสร้างโปรไฟล์หน่วยความจำอีกหน้าต่างหนึ่งลงใน Unity Editor เครื่องมือสร้างโปรไฟล์หน่วยความจำช่วยให้คุณวิเคราะห์การใช้งานหน่วยความจำในแอปพลิเคชันได้ละเอียดยิ่งขึ้น คุณสามารถจัดเก็บและเปรียบเทียบสแนปชอตเพื่อค้นหาหน่วยความจำรั่วไหล หรือดูเลย์เอาต์หน่วยความจำเพื่อค้นหาปัญหาการกระจาย Fragment ของหน่วยความจำได้
สำหรับเวิร์กโฟลว์ Unity เฉพาะ Android โปรดดูหัวข้อตรวจสอบการใช้งานหน่วยความจำด้วยเครื่องมือ Unity, เพิ่มประสิทธิภาพการใช้งานหน่วยความจำใน Unity และแก้ไขข้อบกพร่อง LMK สำหรับเกม Unity
Unreal Memory Insights
แอปที่สร้างโดย Unreal Engine สามารถใช้ Unreal Memory Insights เพื่อดูข้อมูลโดยละเอียดเกี่ยวกับการจัดสรรและการยกเลิกการจัดสรรหน่วยความจำ รวมถึงแท็ก Low Level Memory (LLM) และ Call Stack ที่เชื่อมโยงกับบล็อกหน่วยความจำ
ระบบการค้นหาข้อมูลเชิงลึกเกี่ยวกับหน่วยความจำสามารถค้นหาการจัดสรรที่ใช้งานอยู่ ณ จุดใดก็ได้ ระบุการเปลี่ยนแปลงในการใช้งานหน่วยความจำ ค้นหาหน่วยความจำรั่วไหล และแยกความแตกต่างระหว่างการจัดสรรระยะสั้นและระยะยาว
ตั้งแต่ UE 5.4 เป็นต้นไป Memory Insights จะรองรับการติดตามหน่วยความจำด้วย Call Stack สำหรับโปรเจ็กต์ Android
สำหรับเวิร์กโฟลว์ Unreal เฉพาะ Android โปรดดูตรวจสอบการใช้งานหน่วยความจำด้วย Unreal และเพิ่มประสิทธิภาพการใช้งานหน่วยความจำใน Unreal
ข้อมูลเชิงลึกเกี่ยวกับหน่วยความจำเหลือน้อย
Android มี Callback และ API ที่ช่วยให้คุณลดการใช้งานหน่วยความจำของเกมและระบุสาเหตุที่การเรียกใช้เกมก่อนหน้านี้สิ้นสุดลง
Callback
อย่าลงทะเบียนสำหรับ Callback ของ trim ที่เลิกใช้งานแล้ว Android ไม่มี API สำหรับตรวจจับเหตุการณ์แรงกดดันหน่วยความจำแบบเนทีฟก่อนที่ระบบจะเรียกคืนหน่วยความจำ และ Callback การตัดหน่วยความจำที่ทำงานอยู่แบบละเอียด (TRIM_MEMORY_RUNNING_*) ไม่มีประสิทธิภาพในการป้องกันการหยุดทำงานเนื่องจากหน่วยความจำไม่เพียงพอ
ด้วยเหตุนี้ Android จึงเลิกใช้ระดับการตัดแต่งทั้งหมดนอกเหนือจาก TRIM_MEMORY_UI_HIDDEN และ TRIM_MEMORY_BACKGROUND ใช้ Callback ที่เหลือเหล่านี้ หรือวงจรของเครื่องมือที่เทียบเท่า เช่น OnApplicationPause ของ Unity และ ApplicationWillEnterBackgroundDelegate ของ Unreal เพื่อปล่อย UI และทรัพยากรเสริมเมื่อเกมย้ายไปทำงานอยู่เบื้องหลัง ดูรายละเอียดการติดตั้งใช้งานได้ที่หัวข้อลดการใช้หน่วยความจำในเกม
การสิ้นสุดเกม
Android พยายามใช้หน่วยความจำทั้งหมดที่มีเพื่อแคชแอปและเกมเพื่อให้โหลดได้อย่างรวดเร็ว (ปรับปรุงประสบการณ์ของผู้ใช้) แต่เมื่อหน่วยความจำมีจำกัด ระบบจะปิดแอปและเกมที่ใช้หน่วยความจำมากที่สุดเพื่อเพิ่มหน่วยความจำสำหรับการทำงานปกติของอุปกรณ์
ข้อมูล ข้อมูลเชิงลึก และแนวทางปฏิบัติแนะนำที่จะช่วยให้คุณใช้งานหน่วยความจำของเกมได้ดีขึ้นมีดังนี้
- ใช้
ApplicationExitInfo: API นี้จะแสดงเหตุผลที่ระบบ Android หยุดการทำงานของเกมก่อนหน้า ใช้ApplicationExitInfoเพื่อตรวจสอบหน่วยความจำเหลือน้อย (REASON_LOW_MEMORY) หรือการสิ้นสุดการจำกัดหน่วยความจำ (REASON_MEMORY_LIMITER) เป็นสาเหตุของการออกจากกระบวนการก่อนหน้า (ดูข้อมูลการออกจากแอปพลิเคชันสำหรับเกม) ตรวจสอบว่าเกมถูกปิดเนื่องจากหน่วยความจำไม่เพียงพอหรือไม่ เพื่อให้สามารถเพิ่มประสิทธิภาพเกมให้ใช้หน่วยความจำน้อยลงในอุปกรณ์นั้น - ดู RAM จริงทั้งหมด: เพื่อป้องกันไม่ให้เกมถูกปิดเมื่อทำงานอยู่เบื้องหน้าและเพื่อให้ตรงกับความสามารถของอุปกรณ์ ให้ดู RAM จริงทั้งหมดต่ออุปกรณ์เพื่อดูรายละเอียดที่ละเอียดเพื่อปรับการใช้งานหน่วยความจำของเกมตามนั้น หากเป้าหมายคือการป้องกันไม่ให้แอปถูกปิดทันทีหลังจากย้ายไปทำงานอยู่เบื้องหลัง (เพื่อให้ผู้เล่นทำงานหลายอย่างพร้อมกันได้) ให้ใช้ Callback ตัดแต่ง (โดยเฉพาะ
TRIM_MEMORY_UI_HIDDEN) เพื่อลดการใช้งานหน่วยความจำของเกม
แหล่งข้อมูลเพิ่มเติม
- เกี่ยวกับการจัดการหน่วยความจำสำหรับเกม
- วิธีตรวจสอบการใช้งานหน่วยความจำในเกม
- วิธีลดการใช้หน่วยความจำในเกม
- ภาพรวมของการจัดการหน่วยความจำ