Mem หลีกๆๆๆๆ

ก่อนอื่นเลยให้ดูนี่

รู้ไหมมีอะไรผิด ??? … อ่ะ ลองรันดู

java -XX:+DumpHeapOnOutOfMemoryError -Xmx8m memleak.MemLeak1

ผลปรากฎว่าผ่านไปไม่เท่าไรขึ้นข้อความมา จับใจความว่า

Exception in thread “main” java.lang.OutOfMemoryError: GC overhead limit exceeded

พร้อม Dump File น้อยๆ โผล่ขึ้นมาเลยจ้า …​ยังงี้ต้องจับเข้า VisualVM

VisualVM สุดยอดพนักงานสืบสวน

เห็นชัดเลยงานนี้ … เกิดอะไรขึ้นกัน ? ทำไม ?

คำตอบง่ายมากเพราะ HashMap ไง

HashMap คือแมพที่สร้างคีย์จาก Hash และ Hash ถูกสร้างจาก hashCode() แต่เราไม่ได้ implement ดังนั้น hashCode จึงเอามาจากค่าสุ่มตอนสร้าง Object สรุปคือเราสร้าง Object ที่ GC เก็บไม่ได้เพียบเลย (เพราะลิงค์กะ Map ด้วย)

ดังนั้นคราวหน้าโปรดระวังหากใช้ HashMap อย่าลืมสร้าง hashCode() ด๋วยยยย