โปรแกรมที่กินหน่วยความจำ

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 โดยทำดังนี้

รูปที่ 1 เข้าถึงอัตรา LMK ที่ผู้ใช้รับรู้ใน Android Vitals

คุณสามารถกรองเมตริก เปรียบเทียบเมตริกกับแอปเทียบเท่า หรือติดตามการเปลี่ยนแปลงของเมตริกเป็นระยะเวลานาน (สูงสุด 3 ปี) ได้เช่นเดียวกับเมตริก Vitals หลักที่คล้ายกัน เช่น ANR และข้อขัดข้อง ข้อมูลจะพร้อมใช้งานสำหรับแอปที่มีอยู่ตั้งแต่วันที่ 28 ม.ค. 2025 เป็นต้นไป

รูปที่ 2 ภาพรวมของอัตรา LMK ใน Android Vitals

วิธีการทำงานของ Low Memory Killer Daemon

แพลตฟอร์ม Android ทำงานบนสมมติฐานที่ว่าหน่วยความจำที่ว่างอยู่คือหน่วยความจำที่สูญเปล่า Android พยายามใช้หน่วยความจำทั้งหมดที่มีอยู่ตลอดเวลา ตัวอย่างเช่น ระบบจะเก็บแอปไว้ในหน่วยความจำหลังจากปิดแอปไปแล้ว เพื่อให้ผู้ใช้สลับกลับไปใช้แอปได้อย่างรวดเร็ว ด้วยเหตุนี้ อุปกรณ์ Android จึงมักทำงานโดยมีหน่วยความจำว่างน้อยมาก (ดูการจัดสรรหน่วยความจำระหว่างกระบวนการต่างๆ)

ในการตัดสินใจว่าจะหยุดกระบวนการใดเมื่อหน่วยความจำที่ใช้ได้เหลือน้อย Low Memory Killer (LMK) Daemon จะใช้คะแนนหน่วยความจำไม่เพียงพอที่เรียกว่า oom_adj_score เพื่อจัดลำดับความสำคัญของกระบวนการที่ทำงานอยู่ ระบบจะปิดกระบวนการที่มีคะแนนสูงก่อน ระบบจะปิดแอปที่ทำงานอยู่เบื้องหลังก่อน แล้วจึงปิดกระบวนการของระบบเป็นลำดับสุดท้าย ตารางต่อไปนี้แสดงหมวดหมู่การให้คะแนน LMK จากสูงไปต่ำ ระบบจะกำจัดรายการในหมวดหมู่ที่มีคะแนนสูงสุดในแถวที่ 1 ก่อน ดังนี้

กระบวนการของ Android ที่จัดอันดับจากคะแนนสูงสุดไปต่ำสุด ได้แก่ แอปที่ทำงานอยู่เบื้องหลัง แอปก่อนหน้า แอป Home บริการ แอปที่รับรู้ได้ แอปที่ทำงานอยู่เบื้องหน้า แอปที่ทำงานต่อเนื่อง ระบบ และเนทีฟ
รูปที่ 3 กระบวนการของ Android โดยมีคะแนนสูงอยู่ด้านบนและคะแนนต่ำอยู่ด้านล่าง

เครื่องมือวิเคราะห์การใช้หน่วยความจำ

เครื่องมือต่อไปนี้จะช่วยคุณค้นหาและวิเคราะห์ปัญหาเกี่ยวกับหน่วยความจำได้ด้วยวิธีต่อไปนี้

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

หากเกมทำงานบนเครื่องมือแบบเนทีฟ ให้ใช้ HWAddress Sanitizer เพื่อแก้ไขข้อบกพร่องในการจัดสรรหน่วยความจำแบบเนทีฟ

เครื่องมือสร้างโปรไฟล์หน่วยความจำของ Android Studio

Android Studio มีเครื่องมือสร้างโปรไฟล์หน่วยความจำเป็นคอมโพเนนต์ของเครื่องมือสร้างโปรไฟล์ Android ซึ่งช่วยคุณระบุหน่วยความจำรั่วไหลและการเสียหน่วยความจำที่อาจทำให้เกิดการกระตุก ค้าง และแม้แต่แอปขัดข้อง เครื่องมือวิเคราะห์จะแสดงกราฟการใช้หน่วยความจำของแอปแบบเรียลไทม์ และช่วยให้คุณบันทึกฮีปดัมป์, บังคับให้เก็บขยะ และติดตามการจัดสรรหน่วยความจำได้

เครื่องมือสร้างโปรไฟล์หน่วยความจำของ Android Studio แสดงการอ้างอิง JNI ส่วนกลางในฮีป
รูปที่ 4 การดูการอ้างอิง JNI ส่วนกลางในเครื่องมือสร้างโปรไฟล์หน่วยความจำของ Android Studio

เครื่องมือสร้างโปรไฟล์หน่วยความจำของ Unity

หากใช้ Unity Engine เพื่อสร้างแอป คุณสามารถทำตามคำแนะนำในการทำโปรไฟล์หน่วยความจำของ Unity Unity มีเครื่องมือ 2 อย่างในการวิเคราะห์การใช้งานหน่วยความจำในแอปพลิเคชันใน Unity

เครื่องมือแรกคือโมดูลเครื่องมือสร้างโปรไฟล์หน่วยความจำ ซึ่งเป็นเครื่องมือสร้างโปรไฟล์ในตัวที่ให้ข้อมูลพื้นฐานเกี่ยวกับตำแหน่งที่แอปพลิเคชันใช้หน่วยความจำ

โมดูลหน่วยความจำจะแสดงการจัดสรรหน่วยความจำ เช่น หน่วยความจำของพื้นผิวและหน่วยความจำของ Mesh
รูปที่ 5 หน้าต่าง Unity Profiler ที่เลือกโมดูลหน่วยความจำไว้

เครื่องมือที่ 2 คือแพ็กเกจเครื่องมือสร้างโปรไฟล์หน่วยความจำ ซึ่งเป็นแพ็กเกจ Unity ที่คุณเพิ่มลงในโปรเจ็กต์ได้ แพ็กเกจจะเพิ่มหน้าต่างเครื่องมือสร้างโปรไฟล์หน่วยความจำอีกหน้าต่างหนึ่งลงใน Unity Editor เครื่องมือสร้างโปรไฟล์หน่วยความจำช่วยให้คุณวิเคราะห์การใช้งานหน่วยความจำในแอปพลิเคชันได้ละเอียดยิ่งขึ้น คุณสามารถจัดเก็บและเปรียบเทียบสแนปชอตเพื่อค้นหาหน่วยความจำรั่วไหล หรือดูเลย์เอาต์หน่วยความจำเพื่อค้นหาปัญหาการกระจาย Fragment ของหน่วยความจำได้

หน้าต่างเครื่องมือสร้างโปรไฟล์หน่วยความจำของ Unity แสดงรายละเอียดสแนปชอตหน่วยความจำ
รูปที่ 6 การวิเคราะห์สแนปชอตหน่วยความจำโดยใช้หน้าต่างเครื่องมือสร้างโปรไฟล์หน่วยความจำ

สำหรับเวิร์กโฟลว์ 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

เครื่องมือติดตามข้อมูลเชิงลึกเกี่ยวกับหน่วยความจำที่แสดงกราฟหน่วยความจำหลัก จำนวนการจัดสรรแบบเรียลไทม์ และจำนวนเหตุการณ์การจัดสรร/การเพิ่มพื้นที่ว่าง
รูปที่ 7 เครื่องมือติดตาม Memory Insights ของ Unreal

สำหรับเวิร์กโฟลว์ 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) เพื่อลดการใช้งานหน่วยความจำของเกม

แหล่งข้อมูลเพิ่มเติม