OutOfMemoryError được ném bởi JVM , khi JVM không có đủ bộ nhớ khả dụng, để cấp phát. OutOfMemoryError rơi vào E danh mục rror trong Ngoại lệ phân cấp lớp.
Để tạo OutOfMemoryError
- Chúng tôi sẽ phân bổ một lượng lớn bộ nhớ, điều này sẽ làm cạn kiệt dung lượng bộ nhớ heap .
- Chúng tôi sẽ tiếp tục phân bổ bộ nhớ và điểm sẽ đạt được, khi JVM không có đủ bộ nhớ để cấp phát, thì OutOfMemoryError sẽ được ném.
- Khi chúng tôi sẽ bắt được OutOfMemory lỗi, chúng tôi có thể ghi lại 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; } } }
Đầu ra
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 kết xuất đống trên OutOfMemoryError
Khởi động ứng dụng với đối số VM -XX:+ HeapDumpOnOutOfMemoryError . Điều này sẽ yêu cầu JVM tạo kết xuất đống khi OOM xảy ra
$ java -XX:+HeapDumpOnOutOfMemoryError ...
Bước 2:Tái tạo sự cố
Nếu chúng tôi không thể tái tạo sự cố trong môi trường phát triển , chúng tôi có thể phải sử dụng sản xuất môi trường . Khi chúng tôi tái tạo sự cố và ứng dụng ném một OOM, nó sẽ tạo ra một tệp kết xuất heap.
Bước 3:Điều tra sự cố bằng cách sử dụng tệp kết xuất heap
Sử dụng VisualVM để đọc tệp kết xuất heap và chẩn đoán sự cố. VisualVM là một chương trình nằm trong JDK_HOME / bin / jvisualvm . Tệp kết xuất đống có tất cả thông tin về việc sử dụng bộ nhớ của ứng dụng.