Android : Clear Android App JVM with System.exit helping OutOfMemoryError
ในปัจจุบันคอมพิวเตอร์หรือมือถือสมาร์ทโฟน มีสมรรถนะของเครื่องสูงมากขึ้น ทำให้การสร้างแอปปลิเคชันไม่ต้องกังวลเรื่องของทรัพยากรมากนัก แต่ทว่าผู้ใช้บริการแอปปลิเคชันทั่วโลก ไม่ได้สามารถเปลี่ยนคอมพิวเตอร์หรือมือถือสมาร์ทโฟนเป็นรุ่นใหม่ได้ทั้งหมด หากไล่ดูสถิติรายงานใน Google Play Android version usage แล้ว จะพบว่ายังมีผู้ใช้บริการแอปปลิเคชันที่ยังใช้เครื่องรุ่นเก่า ปัจจุบันที่พบคือ Android Version 4.x (API 14 – 19) ซึ่งเปิดตัวตั้งแต่ปี 2011 – 2013 (นับถอยไป 7 – 9 ปีก่อนหน้า) นั่นหมายความว่า สมรรถะเครื่องและทรัพยากรของเครื่องจะน้อยกว่าปัจจุบันมาก
หากเรายังต้องการให้ผู้ใช้บริการเหล่านี้สามารถใช้ได้ การพัฒนาอาจจำเป็นต้องคำนึงถึงการใช้ทรัพยากรของเครื่องด้วย วันนี้ขอยก 1 ปัญหาที่พบบ่อยคือ OutOfMemoryError
สาเหตุใหญ่ๆของปัญหา OutOfMemroyError (หน่วยความจำไม่พอนำมาใช้) คือ
- Low Memory Resource หน่วยความจำมีไม่มากจริงๆ เนื่องจากว่าเป็นเครื่องที่มีทรัพยากรน้อย
- Memory Performance Tuning ข้อนี้คือมีหน่วยความจำมากพอ แต่ไม่ได้มีการปรับแต่งการนำหน่วยความจำมาใช้ (ก็จะใช้ค่าเริ่มต้นที่ระบบกำหนด) สมมติว่า ค่าเร่ิมต้นกำหนด Maximum Java heap size = 1024m แต่แอปปลิเคชันที่เราพัฒนามีการใช้งานเกิน 1024m แอปปลิเคชันก็จะ OutOfMemoryError ขึ้นมา การแก้ไขเราจะต้องมอนิเตอร์การใช้งานหน่วยความจำของแอปปลิเคชันแล้วทำการปรับแต่งให้รองรับกับการทำงาน ในตัวอย่างนี้ เราสามารถเพิ่ม Maximum Java heap size (-Xmx option) เช่น -Xmx2048m (เพิ่มเป็น 2 เท่า) เป็นต้น
แต่วันนี้เราจะมาพูดถึงปัญหาข้อแรกคือ Low Memory Resource แนวทางการแก้ไขหากแอปปลิเคชันของเราสามารถรันบนเครื่องที่หน่วยความจำน้อยได้ หลังจากใช้งานแล้วเราทำการล้างหน่วยความจำออกทุกครั้ง เพื่อคืนกลับไปให้เครื่องมีใช้กับแอปปลิเคชันอื่นได้ วิธีการล้างหน่วยความจำหลังจากปิดโปรแกรมแล้ว (Terminate JVM)
ปกติเวลาเราให้ผู้ใช้บริการออกจากแอปปลิเคชันของเรา เราจะใส่โค้ด finish(); เท่านั้น แต่ถ้าเราเปิดเข้าไปในเครื่องดูข้อมูลการใช้งานหน่วยความจำในเครื่องจะพบว่า แอปปลิเคชันของเรายังจองพื้นที่หน่วยความจำอยู่ ดังนั้นให้เราเพิ่มโค้ดอีก 1 บรรทัดต่อจาก finish(); คือ
System.exit(0);
หลังจากปิดแอปปลิเคชันแล้ว ให้ระบบทำการยกเลิกหน่วยความจำด้วย