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

Java에서 StackOverflowError와 OutOfMemoryError의 차이점은 무엇입니까?


자바 프로그램을 실행할 때마다 운영 체제는 JVM에 일부 메모리를 할당합니다. JVM은 이 메모리를 두 부분으로 나눕니다. 하나는 스택 메모리이고 다른 하나는 힙 메모리입니다. 스택은 메소드 실행에 사용되며 힙은 객체를 저장하는 데 사용됩니다. 스택이 가득 차면 JVM에서 java.lang.StackOverflowError가 발생하고 힙이 가득 차면 JVM에서 java.lang.OutOfMemoryError가 발생합니다.

스택 오버플로 오류

  • 스택은 메소드 실행에 사용됩니다. 모든 메서드 호출에 대해 스택 메모리에 하나의 블록이 생성됩니다.
  • 매개변수, 로컬 변수 또는 개체에 대한 참조와 같은 메서드와 관련된 데이터가 이 블록에 저장됩니다.
  • 메소드 실행이 완료되면 이 블록은 스택에 저장된 데이터와 함께 스택에서 제거됩니다.
  • 메소드를 호출할 때마다 실행을 끝내고 스택 메모리를 떠나야 합니다.
  • 메소드가 스택에 남아 있으면 스택이 가득 차고 JVM은 java.lang.StackOverflowError를 발생시킵니다.

메모리 부족 오류

  • 자바에서 생성한 객체는 힙 메모리에 저장됩니다. 개체가 더 이상 필요하지 않으면 메모리에서 제거해야 합니다.
  • 가비지 수집기는 힙 메모리에서 원하지 않는 개체를 제거합니다.
  • 객체에 라이브 참조가 있으면 가비지 수집기가 이를 제거하지 않습니다. 라이브 참조가 없는 개체만 제거합니다.
  • 메소드를 호출할 때마다 실행을 끝내고 스택 메모리를 떠나야 합니다.
  • 힙 메모리에 새 개체를 위한 공간이 없으면 JVM에서 java.lang.OutOfMemoryError를 발생시킵니다.