Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

OutOfMemoryError là gì và các bước tìm nguyên nhân gốc rễ của OOM trong Java?


OutOfMemoryError được ném bởi JVM, khi JVM không có đủ bộ nhớ khả dụng để cấp phát. OutOfMemoryError thuộc loại Error trong hệ thống phân cấp Exception.

Để tạo ra OutOfMemoryError

  • Chúng ta sẽ cấp phát một khối bộ nhớ lớn, làm cạn kiệt heap memory storage.
  • Chúng ta sẽ tiếp tục cấp phát bộ nhớ và sẽ đến một lúc JVM không còn đủ bộ nhớ để cấp phát, khi đó OutOfMemoryError sẽ được ném.
  • Khi chúng ta bắt OutOfMemory error, chúng ta có thể ghi log lỗi.

Ví dụ

public class OutOfMemoryErrorDemo { 
    public static void main(String[] args) throws Exception { 
        int dummyArraySize = 15; 
        System.out.println("Max JVM memory: " + Runtime.getRuntime().maxMemory()); 
        long memoryConsumed = 0; 
        try { 
            long[] memoryAllocated = null; 
            for(int loop = 0; loop < Integer.MAX_VALUE; loop++) { 
                memoryAllocated = new long[dummyArraySize]; 
                memoryAllocated[0] = 0; 
                memoryConsumed += dummyArraySize * Long.SIZE; 
                System.out.println("Memory Consumed till now: " + memoryConsumed); 
                dummyArraySize *= dummyArraySize * 2; 
                Thread.sleep(500); 
            } 
        } catch (OutOfMemoryError outofMemory) { 
            System.out.println("Catching out of memory error"); 
            //Log the information, so that we can generate the statistics 
            throw outofMemory; 
        } 
    } 
}

Kết quả

Max JVM memory: 119537664 Memory Consumed till now: 960 Memory Consumed till now: 29760 Memory Consumed till now: 25949760 Catching out of memory error Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at OutOfMemoryErrorDemo.main(OutOfMemoryErrorDemo.java:9)


Các bước tìm nguyên nhân gốc rễ của OOM

Bước 1: Tạo heap dump khi OutOfMemoryError

Khởi động ứng dụng với VM argument -XX:+HeapDumpOnOutOfMemoryError. Điều này sẽ yêu cầu JVM tạo ra heap dump khi OOM xảy ra

$ java -XX:+HeapDumpOnOutOfMemoryError ...

Bước 2: Tái hiện vấn đề

Nếu chúng ta không thể tái hiện vấn đề trong môi trường phát triển, chúng ta có thể phải sử dụng môi trường production. Khi tái hiện vấn đề và ứng dụng ném OOM, nó sẽ tạo ra file heap dump.

Bước 3: Điều tra vấn đề sử dụng file heap dump

Sử dụng VisualVM để đọc file heap dump và chẩn đoán vấn đề. VisualVM là một chương trình nằm trong JDK_HOME/bin/jvisualvm. File heap dump chứa tất cả thông tin về việc sử dụng bộ nhớ của ứng dụng.