JAVA

[JAVA] JVM 메모리 사용 영역

sagecode 2024. 11. 26. 14:01

JAVA 코드가 어떻게 실행되는지, 그 데이터들이 어떤곳에 저장되는지 알기 위해서는 JVM을 먼저 이해해야 한다.

 

1. JVM(JAVA Virtual Machine)

위 그림은 Java 코드가 실행되는 과정이다.

  1. Java 코드는 Java Compiler를 통해 바이트코드(.class)를 생성한다.
  2. 바이트코드(.class)를 JVM에 있는 Class Loader에 전달되고 JVM이 프로그램을 실행한다.

JVM이 프로그램을 실행할 때, 필요한 메모리들은 어디에 저장되고 어떤 구조로 생겼는지 알아보자.

2. 메모리 사용 영역

JVM 내의 메모리 영역은 JVM Run-time Data Area라고 한다. 크게 5가지 영역으로 나뉘는데, 메소드 영역, 힙 영역, 스택 영역, PC 레지스터 영역, 네이티브 메소드 스택 영역으로 나뉜다.

  • 메소드 영역 (클래스 영역, static 영역) : JVM이 시작될 때 생성되는 공간으로 바이트코드(.class)를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간이다. 메소드 영역에는 코드에서 사용되는 클래스들을 클래서 로더로 읽어 클래스별로 정적 필드와 상수, 메소드 코드, 생성자 코드 등을 분류해서 저장한다.
    • JVM 구동 시작시에 생성이 되며, 종료 시까지 유지되는 공통 영역이다.
  • 힙 영역 : JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다. 즉, new 연산자로 생성되는 클래스와 인스턴스 변수, 배열 등 참조 Type이 저장되는 곳이다.
    • 만약 참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 이것을 JVM은 Garvage Collector를 실행시켜 쓰레기 객체를 힙 영역에서 자동으로 삭제한다.
  • JVM 스택영역 : 스택영역은 int, boolean 등 기본 자료형을 생성할 때 저장하는 공간으로, 임시적으로 사용되는 변수나 정보들이 저장되는 영역이다. 
    • 메소드를 호출할 때마다 프레임(중괄호 {})을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작을 수행합니다.
    • 프레임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 추가되거나 제거됩니다. 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거됩니다.