ฉันใช้เวลา 4 วันเต็มในการพยายามทุกอย่างเท่าที่ทำได้เพื่อหาว่าหน่วยความจำรั่วในแอปที่ฉันกำลังพัฒนา แต่สิ่งต่างๆก็หยุดลงเมื่อนานมาแล้ว
แอปที่ฉันกำลังพัฒนานั้นมีลักษณะทางสังคมดังนั้นให้คิดว่าโปรไฟล์กิจกรรม (P) และแสดงรายการกิจกรรมพร้อมข้อมูล - ตัวอย่างเช่นป้าย (B) คุณสามารถกระโดดจากโปรไฟล์ไปยังรายการป้ายไปยังโปรไฟล์อื่น ๆ ไปยังรายการอื่น ๆ ฯลฯ
ลองนึกภาพการไหลเช่นนี้ P1 -> B1 -> P2 -> B2 -> P3 -> B3 เป็นต้นเพื่อความสอดคล้องฉันกำลังโหลดโปรไฟล์และป้ายของผู้ใช้คนเดียวกันดังนั้นหน้า P แต่ละหน้าจึงเหมือนกันและเป็นเช่นนั้น แต่ละหน้า B
สาระสำคัญทั่วไปของปัญหาคือ: หลังจากนำทางไปสักหน่อยขึ้นอยู่กับขนาดของแต่ละหน้าฉันได้รับข้อยกเว้นหน่วยความจำที่ไม่เพียงพอในตำแหน่งสุ่ม - บิตแมปสตริง ฯลฯ ดูเหมือนจะไม่สอดคล้องกัน
หลังจากทำทุกอย่างเท่าที่จะนึกได้ว่าทำไมฉันถึงมีหน่วยความจำไม่เพียงพอฉันก็คิดอะไรไม่ออก สิ่งที่ฉันไม่เข้าใจคือทำไม Android ถึงไม่ฆ่า P1, B1 และอื่น ๆ หากหน่วยความจำหมดเมื่อโหลดและขัดข้องแทน ฉันคาดว่ากิจกรรมก่อนหน้านี้จะตายและฟื้นคืนชีพถ้าฉันกลับไปหาพวกเขาผ่าน onCreate () และ onRestoreInstanceState ()
นับประสาสิ่งนี้ - แม้ว่าฉันจะทำ P1 -> B1 -> ย้อนกลับ -> B1 -> ย้อนกลับ -> B1 ฉันก็ยังได้รับความผิดพลาด สิ่งนี้บ่งบอกถึงการรั่วไหลของหน่วยความจำบางประเภทแม้หลังจากทิ้ง hprof และใช้ MAT และ JProfiler ฉันไม่สามารถระบุได้
ฉันได้ปิดใช้งานการโหลดรูปภาพจากเว็บ (และเพิ่มข้อมูลการทดสอบที่โหลดเพื่อชดเชยและทำการทดสอบอย่างยุติธรรม) และตรวจสอบให้แน่ใจว่าแคชรูปภาพใช้ SoftReferences จริงๆแล้ว Android พยายามเพิ่ม SoftReferences บางส่วนที่มี แต่ก่อนที่หน่วยความจำจะล่ม
หน้าป้ายรับข้อมูลจากเว็บโหลดลงในอาร์เรย์ของ EntityData จาก BaseAdapter และป้อนข้อมูลไปยัง ListView (จริงๆแล้วฉันใช้ MergeAdapter ที่ยอดเยี่ยมของCommonsWareแต่ในกิจกรรม Badge นี้มีอะแดปเตอร์เพียง 1 ตัวเท่านั้น แต่ฉัน ต้องการพูดถึงข้อเท็จจริงนี้ไม่ทางใดก็ทางหนึ่ง)
ฉันได้ตรวจสอบรหัสแล้วและไม่พบสิ่งที่จะรั่วไหล ฉันล้างและลบล้างทุกอย่างที่ฉันพบและแม้แต่ System.gc () ซ้ายและขวา แต่แอพก็ยังขัดข้อง
ฉันยังไม่เข้าใจว่าทำไมกิจกรรมที่ไม่ได้ใช้งานที่อยู่ในกองซ้อนจึงไม่ได้รับการเก็บเกี่ยวและฉันก็ชอบที่จะคิดออกจริงๆ
ณ จุดนี้ฉันกำลังมองหาคำแนะนำคำแนะนำวิธีแก้ปัญหา ... อะไรก็ได้ที่ช่วยได้
ขอขอบคุณ.
outOfMemory
ข้อผิดพลาด ขอบคุณ!