![memory-leak-00]()
![memory-leak-00]()
สำหรับ Android app นั้นปัญหาที่ทำให้ app crash น่าจะมีอยู่สองปัญหาใหญ่ ๆ คือ
- NullPointerException (NPE)
- OutOfMememoryError (OOM) หรือ Memory Leak
ทั้งสองปัญหานั้นมีต้นเหตุมาจากประสบการณ์ของนักพัฒนาล้วน ๆ
ซึ่ง NullPointerException นั้นสามารถแก้ไขได้ง่ายกว่า
ถ้าเขียน code สำหรับการดักจับปัญหาให้ดี ๆ
พร้อมทั้งใช้ความสามารถของภาษาเช่น Optional เป็นต้น
แต่ว่า OutofMememoryError หรือ Memory Leak นั้น
มันเป็นสิ่งที่ตรวจสอบยากกว่าเยอะ
แต่ก็ใช่ว่า จะไม่สามารถตรวจสอบและค้นหาได้เลย
เนื่องจากปัจจุบันมีเครื่องมือในการทำ profiling มากมาย
มาดูว่า เราจะค้นหาและแก้ไขปัญหานี้กันอย่างไร
เริ่มต้นด้วย Error ที่จะเจอแสดงผลดังนี้
[gist id="23cd52fd5b238cc0e685e4f4762223d3" file="1.txt"]
สำหรับ Android app นั้นมันเกิดขึ้นได้ง่ายมาก ๆ
ถ้านักพัฒนาไม่มีความรู้ความเข้าใจมากนักและไม่ระมัดระวังเพียงพอ
มีต้นเหตุหลัก ๆ ดังนี้
- ใช้ memory แล้วไม่คืนกลับไปยังระบบ
- มีการใช้ memory มากกว่าที่มีหรือที่จองไว้
มีอะไรบ้างละที่ทำให้เกิดปัญหา Memory Leak ใน Android
เก็บข้อมูลแบบ global ใน
Context object มาเกินไป
คำถามคือ คุณรู้ไหมว่า App คุณนั้นเก็บข้อมูลอะไรไว้ใน Context บ้าง ?
ถ้าไม่รู้จงทำให้รู้ซะ
ต่อมาเรื่องของ Activity
เนื่องจาก Activity นั้นเป็น subclass ของ Context
ดังนั้นปัญหาจาก Context จึงส่งต่อมาด้วยเสมอ
ใน Activity มีข้อมูลอะไรที่เป็น static หรือไม่ ?
ปัญหาหลัก ๆ เลยก็เช่น View, Drawable เป็นต้น
ยังไม่พอนะ ยังมีพวก static variable ต่าง ๆ
ที่นักพัฒนาอาจจะรู้และไม่รู้
รวมทั้งการ bind/unbind service ต่าง ๆ
รวมทั้งการ register/unregister service ต่าง ๆ
รวมทั้งขาดความรู้และเข้าใจ framework/library ที่นำมาใช้งานอีกด้วย
ยังไม่เรื่องการใช้งาน extenal resource อื่น ๆ อีก เช่น Network เป็นต้น
ลองคิดดูสิว่า ถ้าส่ง request ไปบ่อย ๆ
ลองคิดดูสิว่า ถ้ารอ response นาน ๆ
หรือเขียน code ไม่ดี ให้ทำการวน loop รอไปเรื่อย ๆ !!
ดังนั้นอย่าเก็บข้อมูลหรือ state ที่เกี่ยวข้องกับ Life cycle ของ Activity ไว้นาน ๆ
จะเห็นได้ว่า เราต้องเข้าใจ Life Cycle ของ Activity ให้ดีด้วยนะ
ในการทำงานจริง ๆ นั้น Android Studio ก็มีเครื่องมือไว้ให้ใช้แล้วนะ
นั่นก็คือ
Memory Monitoring
ทำให้เราเห็นว่า App ที่เราพัฒนานั้น
มีการใช้งาน memory อย่างไรบ้าง ?
ถ้าพบว่ากราฟการใช้งาน memory ของ App เป็นดังรูป
ก็ขอให้รู้เลยว่าคุณกำลังจุดระเบิดเวลาไว้แล้วนะ !!
เนื่องจากยิ่งให้งาน App ไป จำนวน memory ที่ใช้งานยิ่งเยอะ
ไม่เคยคืน memory ให้ระบบเลยนะ
ยังไม่พอนะ Android Studio ยังให้เราเข้าไปดูรายละเอียดใน Heap dump ได้อีก
ซึ่งทำให้เห็นข้อมูลชัดขึ้น
แน่นอนว่า สามารถดูในแต่ละช่วงของเวลาได้เลย
จากนั้นจึงนำมาเปรียบเทียบต่อไป
จากตัวอย่างจะพบว่า String object เยอะมาก ๆ
ซึ่งมันคือระเบิดเวลาดี ๆ นี่เอง !!
เมื่อเราเจอปัญหาสิ่งที่ต้องทำคือ การแก้ไข
เพื่อทำให้การใช้ memory มีประสิทธิภาพมากขึ้น
นั่นคือใช้เสร็จแล้วก็ต้องคืน
แสดงดังรูป
สุดท้ายนี้คงไม่มีนักพัฒนาคนไหน
จะพัฒนา app ที่พังง่าย ๆ ออกไปให้ลูกค้าใช้งานหรอกนะ !!
… Your app หยุดแล้ววววว ..
คำถามคือ วันนี้นักพัฒนาทำ
profiling ของระบบแล้วหรือยัง ?
ถ้ายังจงทำซะ
และยังมี library อื่น ๆ ที่น่าสนใจอีกนะเช่น
Reference Websites
http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
https://developer.android.com/training/displaying-bitmaps/index.html