본문 바로가기

Java

[Java] JVM 메모리 사용 방식

 

JAVA JVM 메모리 사용방식

 

메모리는 크게 코드 실행 영역, static 영역, stack 영역, Heap 영역 4자지로 구성

코드 실행 영역  스태틱(Static) 영역
스택(Stack) 영역 힙(Heap) 영역

스태틱(Static) 영역

  • static영역은 클래스들의 놀이터
  • JVM은 가장 먼저 java.lang 패키지를 static영역에 배치된다.
  • 프로그램 상의 모든 클래스와 import패키지는 static영역에 배치 된다.
  • 클래스 멤버 변수는 static 영역에 생성되며, JVM이 종료될 때까지 고정된(static) 상태로 자리를 지킨다.

 

스택(Stack) 영역

  • stack 영역은 메서드들의 놀이터
  • 여는 중괄호 "{" 를 만날 때마다 스택 프레임(stack frame)이 생긴다.
  • 닫는 중괄호 "}" 를 만나면 스택 프레임(stack frame)이 소멸된다.
  • 지역 변수는 스택 프레임 안에 생성되며, 스택 프레임이 소멸되면 같이 소멸된다.
  • 외부 스택 프레임에서 내부 스택 프레임의 변수 접근은 불가능, 내부에서 외부는 가능하다. 예를 들어 main() 스택 프레임에서 if() 스택 프레임은 접근 불가능, if() 스택 프레임에서 main() 스택 프레임 접근 가능하다.
  • 서로 다른 스택 프레임들은 서로 지역 변수들의 접근이 불가능하다.
  • 멀티 스레드는 스택 영역을 스레드 개수만큼 분할하여 사용하게 되고, 하나의 스레드는 다른 스레드의 스택 영역에 접근할 수 없지만 스태틱 영역과 힙 영역은 공유해서 사용한는 구조다.

 

힙(Heap) 영역

  • 객체들의 놀이터
  • 객체 멤버 변수는 heap 영역에 배치
  • 참조되지 않는 객체는 가비지 컬렉터(GC)에 의해 소멸된다.
  • 상속의 경우 하위 클래스와 함께 상위 클래스도 힙 영역에 생성된다.

 


  • JDK : 자바 개발 도구
  • JRE : 자바 실행 환경
  • JVM : 자바 가상 기계

JRE는 눈에 보이지 않게 뒤에서 JVM을 부팅하고 JVM은 메모리 구조를 만들어 java.lang 패키지 로딩, 각종 클래스 로딩, main() 메서드 스택 프레임 배치, 변수 공간 배치 등 여러 가지 일을 처리한다.

main() 메서드가 끝나면 JRE는 JVM을 종료하고 JRE 자체도 운영체제 상의 메모리에서 사라진다. 따라서 메모리도 사라지게 된다.


 

참고 자료

  • 스프링 입문을 위한 자바 객체 지향의 원리와 이해, 위키북스, 김종민(지은이)