คำเตือนหน่วยความจำ iPhone OS ระดับต่างๆหมายถึงอะไร?


85

เกี่ยวกับศิลปะสีดำในการจัดการหน่วยความจำบนอุปกรณ์ iPhone OS: คำเตือนระดับต่างๆของหน่วยความจำหมายถึงอะไร ระดับ 1? ระดับ 2? หน้าปัดไปที่ 11 หรือไม่?

บริบท: หลังจากช่วงเวลาทดสอบความเครียดของหน่วยความจำที่ยาวนาน - รวมถึงการใช้งานแอพ iPad ของฉันด้วยการเล่นแอพเครื่องเล่นเพลง iPod ฉันมีแนวโน้มที่จะเพิกเฉยต่อคำเตือนหน่วยความจำแบบสุ่ม แต่ไม่บ่อยนักที่ฉันได้รับ แอพของฉันไม่เคยล่ม เคย. แอปของฉันไม่มีการรั่วไหล และคำเตือนของ mems ก็ดูเหมือนจะไม่สำคัญ

ขอบคุณ
Doug

คำตอบ:


98

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


25
ฮ่า ๆ "ถ้าคุณสามารถช่วยเพิ่มหน่วยความจำบางส่วนที่คุณไม่ได้ใช้งานมันจะบวม ล้ำค่า ;-) ไชโย
dugla

15
คุณฟังดูเหมือนเป็นทหารผ่านศึกที่ตื่นเต้นกับการเต้นของหน่วยความจำของ iPhone OS
dugla

193

คำเตือนระดับหน่วยความจำถูกบันทึกโดย SpringBoard ในฐานะนักพัฒนาแอปคุณไม่จำเป็นต้องสนใจมัน แค่ตอบสนอง-{application}didReceiveMemoryWarningก็เพียงพอแล้ว


คำเตือนมี 4 ระดับ (0 ถึง 3) เหล่านี้จะถูกกำหนดจากเฝ้าหน่วยความจำเคอร์เนลและสามารถรับได้โดยฟังก์ชั่นที่ไม่ให้ประชาชนOSMemoryNotificationCurrentLevel()

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

วิธีการเรียกระดับจะไม่ได้รับการบันทึกไว้ SpringBoard ได้รับการกำหนดค่าให้ทำสิ่งต่อไปนี้ในแต่ละระดับหน่วยความจำ:

  1. คำเตือน (ไม่ปกติ) - เปิดใหม่หรือชะลอการเปิดแอปพื้นหลังที่ไม่จำเป็นอีกครั้งโดยอัตโนมัติเช่น Mail
  2. ด่วน - ออกจากแอปพื้นหลังทั้งหมดเช่น Safari และ iPod
  3. วิกฤตและอื่น ๆ - เคอร์เนลจะเข้ายึดครองอาจจะฆ่า SpringBoard หรือแม้แต่รีบูต

ฆ่าแอปที่ใช้งาน (เศษซาก) ไม่ได้รับการจัดการโดยสปริง launchdแต่


ขอบคุณสำหรับสิ่งนี้. มันเป็นการโยนความผิดระหว่างคุณกับวิลลิแฮมนักแสดงตลกในคำถามนี้ อารมณ์ขันชนะ ไชโย
dugla

สวัสดีฉันมีปัญหาเดียวกัน หลังจากเรียกใช้แอปพลิเคชันอย่างต่อเนื่องนานกว่า 5 ครั้งฉันได้รับคำเตือนเกี่ยวกับหน่วยความจำ ระดับ = 1 เป็นเวลา 20 ครั้ง แต่แอปพลิเคชันไม่หยุดทำงาน แต่เมื่อฉันได้รับข้อความนี้ได้รับการเตือนความจำ ระดับ = 2 แอปพลิเคชันของฉันขัดข้อง Level2 ปรากฏขึ้นหลังจาก Level1 ปรากฏเกือบ 20 ครั้ง ฉันจะทำให้แอปพลิเคชันไม่ขัดข้องได้อย่างไร ขอบคุณ
srikanth rongali

1
@ เคนนี่: หน่วยความจำน้อยหมายความว่าเราสามารถใช้งานได้สูงสุดเท่าไหร่ เราสามารถมีไบต์สดได้เท่าไร ในบันทึกข้อขัดข้องของฉันฉันได้รับสิ่งนี้ ฟรีเพจ: 371 เพจแบบใช้สาย: 12192 เพจที่ล้างได้: 0 กระบวนการที่ใหญ่ที่สุด: DTMobileIS นี่หมายความว่าอะไร? ฉันควรดูแลที่ไหน ขอขอบคุณ.
srikanth rongali

9
@srik: คุณควรที่จะถามคำถามใหม่
kennytm

@kennytm: ยังเป็นไปได้กับ ios8 หรือไม่? ฉันเคยเห็นว่ามีการกำหนดฟังก์ชันในlibsystem_c.dylib. มันจะดีมากถ้าฉันสามารถใช้มันได้ ขอบคุณ
focs

12

จากOSMemoryNotification.h ,

/*
** Threshold values for notifications
*/

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

totoal 5 ระดับของการเตือนหน่วยความจำ (-1,3)

เกี่ยวกับคำอธิบายคำเตือนระดับหน่วยความจำคำตอบของ @ KennyTM นั้นยอดเยี่ยมมาก

ฉันต้องการเพิ่มประเด็นที่เกี่ยวข้องซึ่งอาจช่วย PM และอื่น ๆ ได้


คุณควรทำอย่างไรเมื่อมีคำเตือนระดับหน่วยความจำ

เมื่อได้รับคำเตือนเหล่านี้วิธีการจัดการของคุณควรตอบสนองโดยการเพิ่มหน่วยความจำที่ไม่จำเป็นในทันที ตัวอย่างเช่นพฤติกรรมเริ่มต้นของคลาส UIViewController คือการล้างมุมมองหากมองไม่เห็นในขณะนี้ คลาสย่อยสามารถเสริมพฤติกรรมเริ่มต้นโดยการล้างโครงสร้างข้อมูลเพิ่มเติม แอพที่เก็บแคชของรูปภาพอาจตอบสนองโดยการปล่อยรูปภาพใด ๆ ที่ไม่ได้อยู่บนหน้าจอ


จะสังเกตคำเตือนระดับหน่วยความจำได้อย่างไร?

จากhttp://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html

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

UIKit มีหลายวิธีในการรับคำเตือนหน่วยความจำต่ำรวมถึงสิ่งต่อไปนี้:

  • ใช้ applicationDidReceiveMemoryWarning: เมธอดของผู้แทนแอปของคุณ
  • แทนที่เมธอด didReceiveMemoryWarning ในคลาสย่อย UIViewController ที่คุณกำหนดเอง
  • ลงทะเบียนเพื่อรับ UIApplicationDidReceiveMemoryWarningNotificationnotification

วิธีลดรอยเท้าความจำของแอป

  • กำจัดการรั่วไหลของหน่วยความจำ
  • ทำให้ไฟล์ทรัพยากรมีขนาดเล็กที่สุด
  • ใช้ Core Data หรือ SQLite สำหรับชุดข้อมูลขนาดใหญ่
  • โหลดทรัพยากรอย่างเฉื่อยชา
  • สร้างโปรแกรมของคุณโดยใช้ตัวเลือก Thumb

รายละเอียดที่http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html


วิธีการจัดสรรหน่วยความจำอย่างชาญฉลาด?

  • ลดการใช้อ็อบเจ็กต์ที่ปล่อยอัตโนมัติของคุณ : ด้วยการนับการอ้างอิงอัตโนมัติ (ARC) จะเป็นการดีกว่าที่จะจัดสรร / เริ่มต้นอ็อบเจ็กต์และปล่อยให้คอมไพเลอร์ปล่อยอ็อบเจ็กต์ให้คุณในเวลาที่เหมาะสม สิ่งนี้เป็นจริงแม้กระทั่งสำหรับวัตถุชั่วคราวที่ในอดีตคุณอาจมีการปล่อยอัตโนมัติเพื่อป้องกันไม่ให้พวกมันอยู่เกินขอบเขตของวิธีการปัจจุบัน
  • กำหนดขีด จำกัด ขนาดของทรัพยากร : หลีกเลี่ยงการโหลดไฟล์ทรัพยากรขนาดใหญ่เมื่อไฟล์มีขนาดเล็กลง แทนที่จะใช้ภาพความละเอียดสูงให้ใช้ภาพที่มีขนาดเหมาะสมสำหรับอุปกรณ์ที่ใช้ iOS หากคุณต้องใช้ไฟล์ทรัพยากรขนาดใหญ่ให้ค้นหาวิธีโหลดเฉพาะส่วนของไฟล์ที่คุณต้องการในช่วงเวลาใดเวลาหนึ่ง ตัวอย่างเช่นแทนที่จะโหลดไฟล์ทั้งหมดลงในหน่วยความจำให้ใช้ฟังก์ชัน mmap และ munmap เพื่อแมปส่วนต่างๆของไฟล์เข้าและออกจากหน่วยความจำ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการแมปไฟล์ลงในหน่วยความจำ
  • หลีกเลี่ยงชุดปัญหาที่ไม่ถูกผูกไว้: ชุดปัญหาที่ไม่มีขอบเขตอาจต้องใช้ข้อมูลจำนวนมากในการคำนวณโดยพลการ หากชุดนั้นต้องการหน่วยความจำมากกว่าที่มีอยู่แอปของคุณอาจไม่สามารถทำการคำนวณให้เสร็จสมบูรณ์ได้ แอปของคุณควรหลีกเลี่ยงการตั้งค่าดังกล่าวทุกครั้งที่ทำได้และแก้ไขปัญหาเกี่ยวกับขีด จำกัด หน่วยความจำที่ทราบ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.