Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

OutOfMemoryError는 무엇이며 Java에서 OOM의 근본 원인을 찾는 단계는 무엇입니까?

<시간/>

OutOfMemoryError JVM에 의해 발생 , JVM에 사용 가능한 메모리가 충분하지 않은 경우 할당합니다. 메모리 부족 오류 E에 해당 오류 카테고리 예외 클래스 계층.

OutOfMemoryError를 생성하려면

  • 큰 메모리 청크를 할당하여 힙 메모리 저장소를 고갈시킵니다. .
  • 메모리를 계속 할당하고 JVM에 할당할 메모리가 충분하지 않을 때 지점에 도달하고 OutOfMemoryError 던져질 것입니다.
  • OutOfMemory 오류를 기록할 수 있습니다.

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을 발생시키면 힙 덤프 파일이 생성됩니다.

3단계:힙 덤프 파일을 사용하여 문제 조사

VisualVM 사용 힙 덤프 파일 읽기 문제를 진단합니다. 비주얼 VM JDK_HOME/bin/jvisualvm에 있는 프로그램입니다. . 힙 덤프 파일 응용 프로그램의 메모리 사용량에 대한 모든 정보가 있습니다.