ตัวอย่างการ Analyze JAVA HeapDump
6 February 2024
จาก blog ก่อนหน้านี้ที่เขียนแนะนำการใช้เครื่องมือในการวิเคราะห์ heap memory ของ java เวลาที่เกิด heapdump
บางท่านอาจจะหาตัวอย่างมาทดสอบไม่ได้ก็เลยมาเขียนตัวอย่างการทดสอบดูกัน
เริ่มต้นเราก็ต้องมีตัวโปรแกรมที่จะทำให้เกิด heapdump ก่อนโดยจะนำตัวอย่างโปรแกรมมาจาก link นี้
โดยโปรแกรมนี้จะทำการวน loop สร้าง object ชื่อ “List” ไปเรื่อย ๆ จนกว่า heap จะเต็ม
พอเขียนเสร็จแล้วก็นำไป compile เพื่อจะเอามา run เพื่อทดสอบ
หลังจาก compile เสร็จเราก็จะได้ output เป็นโปรแกรมชื่อ “Test.class”
จากนั้นก็ทำการ run ด้วยคำสั่ง
java -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\java Test
คำสั่งนี้จะทำการ run java โปรแกรมโดยกำหนดให้มีขนาดของ heap 512MB (-Xmx512m)
กำหนดให้เมื่อ heap เต็มจนให้บริการต่อไม่ได้แล้วให้ทำการสร้าง file heapdump ออกมา เพื่อให้เราสามารถนำ file นี้ไปทำการ analyze ต่อไป และกำหนดให้สร้าง file ไว้ที่ directory “d:\java”
หลังจากทำการ run ไปได้สักพัก (ของผมใช้เวลาประมาณ 10 นาที) ก็จะ error ให้เห็น
และมีการสร้าง heapdump file ชื่อ “java_pid1188.hprof”
ขนาดของ heapdump จะมีขนาดประมาณเท่ากับขนาดของ heap
เท่านี้เราก็จะได้ file heapdump มาใช้สำหรับ analyze แล้ว จากนั้นเราก็เปิดโปรแกรม MAT จาก blog ที่แล้วมาทำการ analyze file java_pid1188.hprof
จะเห็นว่ามี object ใน heap อยู่ตัวหนึ่งที่มีขนาดใหญ่ที่สุดขนาด 468.2MB
จากนั้นให้มาดูที่ Leak Suspects เพื่อดูว่า object อะไรที่ใช้ heap จนทำให้เต็ม
รอให้โปรแกรมทำการ analyze file สักครู่
จะเห็นว่ามีตัวที่เข้าข่ายเป็นปัญหาอยู่ 1 ตัว ให้กดที่ Details เพื่อดูรายละเอียดต่อไป
เมื่อไล่ลงไปดูเรื่อย ๆ เราก็จะพบว่าตัวที่ใช้ heap สูงถึง 490MB ก็คือตัว object “List” ที่เราสร้างเอาไว้นั่นเอง
ในการนำไปใช้กับระบบจริงเรา (คนเขียนโปรแกรม) คงต้องรู้ว่า object นั่นคืออะไร ถูกเรียกใช้ที่ไหนเพื่อจะได้เข้าไปตรวจสอบ และแก้ไขปัญหาได้…