เมื่อไม่มีอ้างอิงไปยังออบเจ็กต์อีกต่อไป ออบเจ็กต์จะถูก finalize และเมื่อ Garbage Collection เริ่มทำงาน ออบเจ็กต์เหล่านี้จะถูกเก็บรวบรวม ซึ่งทำงานอัตโนมัติโดย JVM เราสามารถเรียก GC โดยตรงได้ แต่ ไม่รับประกันว่า GC จะทำงานทันที
2 วิธีเรียก GC โดยตรง
- System.gc()
- Runtime.gc()
เมธอด java.lang.Runtime.freeMemory() คืนค่าหน่วยความจำว่างใน JVM การเรียก gc() อาจทำให้ค่าที่ freeMemory คืนเพิ่มขึ้น
ตัวอย่างโค้ด
public class GarbageCollectionTest {
public static void main(String args[]) {
System.out.println(Runtime.getRuntime().freeMemory());
for (int i = 0; i <= 100000; i++) {
Double d = new Double(300);
}
System.out.println(Runtime.getRuntime().freeMemory());
System.gc();
System.out.println(Runtime.getRuntime().freeMemory());
}
}
ผลลัพธ์ตัวอย่าง
15648632
13273472
15970072
คำอธิบาย: หน่วยความจำลดลงหลังสร้างออบเจ็กต์มาก แล้วเพิ่มขึ้นหลังเรียก gc() (แต่ไม่รับประกันว่าจะเกิดขึ้นทุกครั้ง)
ข้อสังเกตสำคัญ
- ไม่ควรพึ่งพาการเรียก gc() โดยตรงในโปรดักชัน
- JVM จะตัดสินใจเองว่าจะรัน GC เมื่อใด
- ใช้ -Xms และ -Xmx เพื่อตั้งค่า heap size แทน