Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

JVM(Java Virtual Machine) 스택 영역 완벽 이해하기

JVM(Java Virtual Machine)의 메모리 구조 중 하나인 스택 영역(Stack Area)은 스레드의 실행과 밀접한 관련이 있습니다. 이번 글에서는 JVM 스택 영역의 동작 원리와 구조를 자세히 살펴보겠습니다.

JVM 스택 영역의 핵심 특징

  • 스레드별 독립적인 스택 생성 — 스레드가 생성되는 시점에 JVM은 해당 스레드 전용의 별도 스택을 만듭니다.

  • Push와 Pop 연산만 수행 — JVM은 이 스택 위에서 오직 두 가지 연산만 수행합니다. 데이터를 삽입하는 push와 삭제하는 pop입니다.

  • 런타임 스택(Runtime Stack) — 스레드가 실행 중일 때 해당 스레드에 연결된 스택을 '런타임 스택'이라고 부릅니다.

  • 메서드 호출 정보 저장 — 스레드가 수행하는 모든 메서드 호출, 중간 계산 결과, 지역 변수 할당, 호출 파라미터 등은 하나의 연산 단위로 런타임 스택에 기록됩니다.

  • 실행 종료 시 데이터 삭제 — 스레드가 특정 작업을 마치거나 실행을 종료하면, 스택에서 해당 부분이 제거됩니다.

  • 모든 호출 완료 후 스택 소멸 — 스레드의 모든 호출이 끝나면 스택은 비게 되고, 최종적으로 삭제됩니다.

  • 스레드 종료 직전 스택 해제 — JVM은 스레드를 종료하기 바로 직전에 해당 스레드에 연결된 스택을 소멸시킵니다.

  • 스레드 간 접근 불가 — 특정 스레드의 데이터를 담고 있는 스택은 그 스레드만 접근할 수 있으며, 다른 스레드는 접근할 수 없습니다.

  • 스레드 세이프(Thread-Safe) 보장 — 위 특성 덕분에 스택에 저장된 데이터는 자연스럽게 스레드로부터 안전합니다.

  • 활성화 레코드(Activation Record) — 스레드의 스택에 저장되는 모든 데이터를 '활성화 레코드' 또는 '스택 프레임(Stack Frame)'이라고 합니다.

참고: JVM 스택이 반드시 연속된(Contiguous) 메모리 공간에 위치해야 하는 것은 아닙니다.

활성화 레코드(스택 프레임)의 구조

스택 프레임은 다음의 세 가지 요소로 구성됩니다.

1. 지역 변수 배열 (Local Variable Array)

메서드 내에서 사용되는 지역 변수들이 저장되는 공간입니다. 메서드 파라미터도 이 배열에 포함됩니다.

2. 오퍼랜드 스택 (Operand Stack)

오퍼랜드 스택은 JVM의 작업 공간(Workspace) 역할을 하며, 중간 계산 결과를 임시로 저장하는 데 사용됩니다. 구조상으로는 지역 변수 배열과 유사하지만, push와 pop 연산을 통해서만 접근할 수 있다는 점이 다릅니다.

3. 프레임 데이터 (Frame Data)

프레임 데이터에는 상수 값과 메서드의 반환 데이터가 포함됩니다. 또한 예외(Exception)가 발생하여 catch 블록을 실행하거나 콘솔에 관련 메시지를 출력해야 할 때 필요한 모든 정보를 담고 있는 예외 테이블(Exception Table)에 대한 참조 역시 여기에 저장됩니다.

JVM은 클래스 데이터를 분석하여 필요한 크기의 스택 프레임을 생성합니다. 이러한 구조 덕분에 각 메서드 호출은 독립적인 환경에서 안전하게 실행될 수 있습니다.