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

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

กระบวนการ daemon การหยุดทำงานเนื่องจากหน่วยความจำไม่เพียงพอ (LMK) ของ Android จะตรวจสอบสถานะหน่วยความจำของระบบ Android ที่ทำงานอยู่และตอบสนองต่อ การใช้หน่วยความจำสูงด้วยการหยุดกระบวนการที่มีความสำคัญน้อยที่สุดเพื่อให้ ระบบทำงานในระดับที่ยอมรับได้

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ข้อมูลเชิงลึกเกี่ยวกับหน่วยความจำของ Unreal

แอปที่สร้างโดย Unreal Engine สามารถใช้ Unreal Memory Insights เพื่อดูข้อมูลโดยละเอียดเกี่ยวกับการจัดสรรและการยกเลิกการจัดสรรหน่วยความจำ รวมถึงแท็กหน่วยความจำระดับต่ำ (LLM) และ Callstack ที่เชื่อมโยงกับ บล็อกหน่วยความจำ

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

ตั้งแต่ UE 5.4 เป็นต้นไป Memory Insights จะรองรับการติดตามหน่วยความจำด้วย Callstack สำหรับ โปรเจ็กต์ Android

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

ข้อมูลเชิงลึกเกี่ยวกับหน่วยความจำเหลือน้อย

Android มีการเรียกกลับและ API ที่ช่วยให้คุณลดข้อกำหนดด้านหน่วยความจำของเกม และระบุสาเหตุที่ระบบสิ้นสุดการเรียกใช้เกมก่อนหน้านี้

Callback

อย่าลงทะเบียนสำหรับการเรียกกลับ trim ที่เลิกใช้งานแล้ว Android ไม่มี API สำหรับตรวจหาเหตุการณ์แรงกดดันของหน่วยความจำดั้งเดิมเมื่อระบบทำงานจนถึงขีดจำกัดของหน่วยความจำ เนื่องจาก Callback การตัดไม่ได้ช่วยป้องกันการสิ้นสุดเนื่องจากหน่วยความจำเหลือน้อย Android จึงเลิกใช้งานทั้งหมด ยกเว้น TRIM_MEMORY_UI_HIDDEN และ TRIM_MEMORY_BACKGROUND

การสิ้นสุดการแข่งขัน

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

ข้อมูล ข้อมูลเชิงลึก และแนวทางปฏิบัติแนะนำที่จะช่วยให้คุณใช้หน่วยความจำของเกมได้ดียิ่งขึ้นมีดังนี้

  • ใช้ ApplicationExitInfo: API นี้จะแสดงเหตุผลที่ระบบ Android ปิดการเรียกใช้เกมก่อนหน้านี้ ใช้ ApplicationExitInfoเพื่อตรวจสอบว่าหน่วยความจำเหลือน้อยเป็นสาเหตุที่ทำให้กระบวนการก่อนหน้านี้หยุดทำงานหรือไม่ ตรวจสอบว่าเกมถูกปิดเนื่องจากหน่วยความจำเหลือน้อยหรือไม่ เพื่อให้สามารถเพิ่มประสิทธิภาพเกมให้ใช้หน่วยความจำน้อยลงในอุปกรณ์นั้น
  • ดูRAM จริงทั้งหมด เพื่อป้องกันไม่ให้ระบบปิดเกมเมื่อเกมอยู่เบื้องหน้าและเพื่อให้ตรงกับความสามารถของอุปกรณ์ ให้ดู RAM จริงทั้งหมดต่ออุปกรณ์เพื่อปรับการใช้งานหน่วยความจำของเกมอย่างละเอียดตามนั้น หากเป้าหมายคือการป้องกันไม่ให้ระบบปิดแอปหลังจากย้ายไปทำงานเบื้องหลังไม่นาน (เพื่อให้ผู้เล่นทำงานหลายอย่างพร้อมกันได้) ให้ใช้ Callback trim (TRIM_MEMORY_UI_HIDDEN โดยเฉพาะ) เพื่อลดการใช้งานหน่วยความจำของเกม

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