Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

มาทำการตรวจสอบ Memory Leak ใน Android app กัน

$
0
0

memory-leak-00

memory-leak-00 สำหรับ Android app นั้นปัญหาที่ทำให้ app crash น่าจะมีอยู่สองปัญหาใหญ่ ๆ คือ
  1.  NullPointerException (NPE)
  2. 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 ให้ระบบเลยนะ 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

Viewing all articles
Browse latest Browse all 1997

Trending Articles