ตัวอย่างการ Analyze JAVA HeapDump

Prawit Tangmanopeanchai
2 min readFeb 6, 2024

--

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 นั่นคืออะไร ถูกเรียกใช้ที่ไหนเพื่อจะได้เข้าไปตรวจสอบ และแก้ไขปัญหาได้…

--

--

Prawit Tangmanopeanchai
Prawit Tangmanopeanchai

Written by Prawit Tangmanopeanchai

Head of Cloud Implementation Unit at gosoft (Thailand)

No responses yet