본문 바로가기DocsTIL - Java 기초: JVM 메모리 구조 이해하기
won2dev·
⚠️ 이 글은 저작권 이슈로 인해 일부 내용이 수정 또는 제거되었습니다.
💬 배운 기술 / 지식
- JVM의 역할
- 메모리 영역: 메서드 영역, 힙, 스택, PC 레지스터, 네이티브 메서드 스택
- 객체 저장 위치
- 메모리 흐름과 GC(Garbage Collection)
🧠 JVM이란?
- Java Virtual Machine
- 자바 바이트코드를 OS와 무관하게 실행시켜주는 가상 머신
- 자바 프로그램의 실행을 담당하며, 메모리 관리, GC, 런타임 실행 환경 제공
🧩 JVM 메모리 영역
📦 1. 메서드 영역 (Method Area)
- 클래스 정보, static 변수, 상수, 메서드 코드 저장
- 모든 스레드가 공유함
- 정적 데이터 저장소 역할
🧺 2. 힙 영역 (Heap)
new로 생성한 객체와 배열 저장- GC의 대상이 되는 공간
- 모든 스레드가 공유하는 공간
📄 3. 스택 영역 (Stack)
- 각 스레드마다 개별로 존재
- 메서드 호출 시 생기는 지역 변수 저장
- 메서드 실행이 끝나면 자동으로 제거됨 (LIFO 구조)
🎯 4. PC 레지스터
- 현재 실행 중인 명령어 주소 저장
- 스레드마다 개별로 존재
- JVM이 다음에 실행할 명령어 판단
🛠 5. 네이티브 메서드 스택
- 자바가 아닌 네이티브 코드(C, C++ 등) 실행 시 사용
- JNI(Java Native Interface) 호출 시 필요
🔄 객체 저장 위치와 흐름
- 객체는 힙(Heap) 에 저장됨
- 지역 변수는 스택(Stack) 에 저장되며, 객체 주소(참조값)를 가짐
- 메서드 실행 시마다 스택 프레임 생성 → 종료 시 제거
- GC는 힙 영역의 불필요한 객체를 찾아 자동으로 제거
💡 느낀 점 / 참고 사항
- JVM 구조를 이해하면 메모리 오류나 성능 병목을 분석하는 데 큰 도움이 됨
- GC가 모든 걸 해결해주진 않음 → 객체 생명주기와 참조 해제 관리 중요
- 스택은 작고 빠르지만 임시적, 힙은 크고 유연하지만 GC 대상이 됨
- 멀티스레드 환경에서는 스택은 분리되지만 힙은 공유됨 → 동기화 고려 필요