Computer >> 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 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.