เนื่องจากช่วงนี้ต้องมาทำ Enterprise Application ทำให้ต้องเข้ามาศึกษา Java ให้ลึกซึ้งมายิ่งขึ้น ซึ่งก็คือเรื่องของ Garbage Collection นั่นเอง

อะไรคือ Garbage Collection

เนื่องจาก Java ไม่มี Malloc เหมือนกับ ภาษา C หลังจากที่ JVM ทำการสร้าง object ใดๆขึ้นมา หาก Object นี้ไม่มีการถูกล่าวอ้างถึงอีก Object นี้ก็จะถูกกระบวนการทีเรียกว่า Garbage Collection ทำลายทิ้งไป เพื่อสร้างที่ว่างขึ้นภายใน Heap

โครงสร้างของ Memory ใน JVM จะถูกแบ่งออกเป็น 2 ส่วนคือ

1. Heap

2. Non-Heap

ในที่นี้จะขอกล่าวถึงแต่ส่วนที่เป็น Heap

Heap

คือส่วนของ Memory ที่ทำการเก็บ Object ที่ถูกสร้างขึ้น จากการทำงานของ Java โดยขนาดของ heap นั้นจะขึ้นอยู่กับผู้ใช้งาน ว่าจะกำหนดไว้ที่เท่าไหร่ โดย heap นั้นถูก fix ไว้ หรือไม่ก็ได้ ถ้าหากผู้ใช้ เซท Heap size ไว้ไม่พอดีกับความต้องการของ Application ก็จะทำให้เกิดปัญหา Out Of Memory ขึ้นได้

ซึ่งการเก็บ Object ลงไปใน heap ก็จะถูกแบ่งได้อีกสองสามแบบ คือ Object ที่พึ่งถูกสร้างขึ้มาใหม่ (Young Generation) Object ที่ถูกสร้างมานานแล้ว (Old Generation) และ Object ที่ถูกสร้างขึ้นมาถาวร (Permanent Generation)

ซึ่งในส่วนของ Young Generation ก็จะถูกแบ่งย่อยๆได้อีกสองแบบคือ Eden กับ Survivor Space โดย Object ส่วนใหญ่ เริ่มมานั้นจะถูกเก็บอยู่ใน Eden ส่วน Survivor Space จะเป็นส่วนที่เก็บ Object ที่อยู่รอดจากการทำ GC บน Young Generation ได้อย่างต่ำ 1 ครั้ง ซึ่งถ้าหาก Object ที่อยู่ใน Survivor Space นี้อยู่รอดได้นานพอ ก็จะถูกเลื่อนไปอยู่ใน Heap ส่วนที่เป็น Old Generation

สำหรับ Permanent Generation นั้น จะเป็นส่วนที่ทำการเก็บ Metadata ต่างๆ รวมไปถึงโครงสร้างของ Class ที่ถูกเก็บอยู่ใน Heap โดยทุกครั้งที่ JVM จะทำ GC JVM จะต้องมาหาข้อมูล Object จากใน Permanent Generation เสียก่อน จึงจะลงมือทำ GC ได้ ซึ่ง PermGen นี่ก็มีโอกาสเต็มทำให้เกิด Out Of Memory ได้เช่นเดียวกันกับ Heap

 

ไว้มาต่อเรื่อง GC Techniques