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 . ไฟล์ฮีพดัมพ์ มีข้อมูลทั้งหมดเกี่ยวกับการใช้หน่วยความจำของแอปพลิเคชัน