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

OutOfMemoryError คืออะไรและขั้นตอนในการค้นหาสาเหตุหลักของ OOM ใน Java คืออะไร


OutOfMemoryError ถูกส่งโดย JVM เมื่อ JVM มีหน่วยความจำไม่เพียงพอในการจัดสรร ข้อผิดพลาด OutOfMemory ตกอยู่ใน E หมวดหมู่ข้อผิดพลาด ใน ข้อยกเว้น ลำดับชั้นของคลาส

การสร้าง OutOfMemoryError

  • เราจะจัดสรรหน่วยความจำขนาดใหญ่ ซึ่งจะทำให้ หน่วยความจำฮีปหมด .
  • เราจะจัดสรรหน่วยความจำต่อไปและจุดจะถึงจุด เมื่อ JVM จะมีหน่วยความจำไม่เพียงพอที่จะจัดสรร จากนั้น OutOfMemoryError จะถูกโยนทิ้ง
  • เมื่อเราจะจับ OutOfMemory error เราสามารถบันทึกข้อผิดพลาดได้

ตัวอย่าง

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;
      }
   }
}

ผลลัพธ์

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)


ขั้นตอนในการหาสาเหตุของ OOM

ขั้นตอนที่ 1:สร้างฮีพดัมพ์บน OutOfMemoryError

เริ่มแอปพลิเคชันด้วย อาร์กิวเมนต์ VM -XX:+HeapDumpOnOutOfMemoryError . สิ่งนี้จะบอก JVM ให้สร้าง ฮีปดัมพ์ เมื่อ OOM เกิดขึ้น

$ java -XX:+HeapDumpOnOutOfMemoryError ...

ขั้นตอนที่ 2:ทำซ้ำปัญหา

หากเราไม่สามารถทำให้เกิดปัญหาซ้ำได้ ในสภาพแวดล้อมการพัฒนา เราอาจต้องใช้ การผลิต สิ่งแวดล้อม . เมื่อเราทำซ้ำปัญหาและแอปพลิเคชันส่ง OOM มันจะสร้างไฟล์ heap dump

ขั้นตอนที่ 3:ตรวจสอบปัญหาโดยใช้ไฟล์ heap dump

ใช้ VisualVM เพื่ออ่าน ไฟล์ฮีพดัมพ์ และวินิจฉัยปัญหา VisualVM เป็นโปรแกรมที่อยู่ใน JDK_HOME/bin/jvisualvm . ไฟล์ฮีพดัมพ์ มีข้อมูลทั้งหมดเกี่ยวกับการใช้หน่วยความจำของแอปพลิเคชัน