memory-leak-00
สำหรับ Android app นั้นปัญหาที่ทำให้ app crash น่าจะมีอยู่สองปัญหาใหญ่ ๆ คือ

  1.  NullPointerException (NPE)
  2. OutOfMememoryError (OOM) หรือ Memory Leak

ทั้งสองปัญหานั้นมีต้นเหตุมาจากประสบการณ์ของนักพัฒนาล้วน ๆ
ซึ่ง NullPointerException นั้นสามารถแก้ไขได้ง่ายกว่า
ถ้าเขียน code สำหรับการดักจับปัญหาให้ดี ๆ
พร้อมทั้งใช้ความสามารถของภาษาเช่น Optional เป็นต้น

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

เริ่มต้นด้วย Error ที่จะเจอแสดงผลดังนี้

สำหรับ 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 ให้ระบบเลยนะ

memory-leak-01

ยังไม่พอนะ Android Studio ยังให้เราเข้าไปดูรายละเอียดใน Heap dump ได้อีก
ซึ่งทำให้เห็นข้อมูลชัดขึ้น
แน่นอนว่า สามารถดูในแต่ละช่วงของเวลาได้เลย
จากนั้นจึงนำมาเปรียบเทียบต่อไป

memory-leak-02

จากตัวอย่างจะพบว่า String object เยอะมาก ๆ
ซึ่งมันคือระเบิดเวลาดี ๆ นี่เอง !!

memory-leak-03

เมื่อเราเจอปัญหาสิ่งที่ต้องทำคือ การแก้ไข
เพื่อทำให้การใช้ memory มีประสิทธิภาพมากขึ้น
นั่นคือใช้เสร็จแล้วก็ต้องคืน
แสดงดังรูป

memory-leak-04

สุดท้ายนี้คงไม่มีนักพัฒนาคนไหน

จะพัฒนา 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

Tags: