โปรแกรม Java รันบน JVM ใช้ Heap Memory จัดการข้อมูล ถ้าโปรแกรมต้องการหน่วยความจำมากเกินกว่า Heap จะเกิด OutOfMemoryError
Command Line Options สำหรับ Heap Size
- -Xms - ตั้งค่า Initial Heap Size (เริ่มต้น)
- -Xmx - ตั้งค่า Maximum Heap Size (สูงสุด)
- -Xss - ตั้งค่า Thread Stack Size
ตัวอย่างการใช้งาน
# เริ่มต้น 512MB, สูงสุด 2GB, Stack 1MB
java -Xms512m -Xmx2g -Xss1m MyApplication
# หรือใช้ G, M, K
java -Xms1g -Xmx4g MyApp
ดู Heap Size ปัจจุบัน (Runtime)
public class HeapSizeTest {
public static void main(String[] args) {
// Heap Size ปัจจุบัน (Initial/Committed)
long heapSize = Runtime.getRuntime().totalMemory();
// Max Heap Size
long maxHeap = Runtime.getRuntime().maxMemory();
// Free Memory
long freeMem = Runtime.getRuntime().freeMemory();
System.out.println("Heap Size (total): " + heapSize + " bytes (" + (heapSize/1024/1024) + " MB)");
System.out.println("Max Heap Size: " + maxHeap + " bytes (" + (maxHeap/1024/1024) + " MB)");
System.out.println("Free Memory: " + freeMem + " bytes (" + (freeMem/1024/1024) + " MB)");
}
}
ผลลัพธ์ตัวอย่าง
Heap Size (total): 16252928 bytes (15 MB)
Max Heap Size: 2574852096 bytes (2455 MB)
Free Memory: 14567892 bytes (13 MB)
แนวทางปฏิบัติที่ดี
- ตั้ง -Xms = -Xmx เพื่อหลีกเลี่ยงการ Resize Heap (Performance)
- -Xmx ไม่ควรเกิน 75-80% ของ RAM เครื่อง
- Monitor GC Logs (
-Xlog:gc*Java 9+,-XX:+PrintGCDetailsJava 8) - ใช้ Profiling Tools: VisualVM, JConsole, JProfiler, Async Profiler
Metaspace (Java 8+)
Class Metadata อยู่ใน Metaspace (Native Memory) ไม่ใช่ Heap ตั้งค่าด้วย:
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1g