Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

เปลี่ยน/เพิ่ม Heap Size ของ JVM ใน Java

โปรแกรม 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:+PrintGCDetails Java 8)
  • ใช้ Profiling Tools: VisualVM, JConsole, JProfiler, Async Profiler

Metaspace (Java 8+)

Class Metadata อยู่ใน Metaspace (Native Memory) ไม่ใช่ Heap ตั้งค่าด้วย:


-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1g