Mem หลีกๆๆๆๆ
ก่อนอื่นเลยให้ดูนี่
รู้ไหมมีอะไรผิด ??? … อ่ะ ลองรันดู
java -XX:+DumpHeapOnOutOfMemoryError -Xmx8m memleak.MemLeak1
ผลปรากฎว่าผ่านไปไม่เท่าไรขึ้นข้อความมา จับใจความว่า
Exception in thread “main” java.lang.OutOfMemoryError: GC overhead limit exceeded
พร้อม Dump File น้อยๆ โผล่ขึ้นมาเลยจ้า …ยังงี้ต้องจับเข้า VisualVM
เห็นชัดเลยงานนี้ … เกิดอะไรขึ้นกัน ? ทำไม ?
คำตอบง่ายมากเพราะ HashMap ไง
HashMap คือแมพที่สร้างคีย์จาก Hash และ Hash ถูกสร้างจาก hashCode() แต่เราไม่ได้ implement ดังนั้น hashCode จึงเอามาจากค่าสุ่มตอนสร้าง Object สรุปคือเราสร้าง Object ที่ GC เก็บไม่ได้เพียบเลย (เพราะลิงค์กะ Map ด้วย)
ดังนั้นคราวหน้าโปรดระวังหากใช้ HashMap อย่าลืมสร้าง hashCode() ด๋วยยยย