[JVM] 메모리 구조와 객체 흐름
[JVM] 메모리 구조와 객체 흐름
도입
남한테 설명할 줄 알아야 진짜 공부가 된거다. JVM에 대해 한번 공부했지만 기억에 남는건 별로 없었다. 이제부턴 모르는 사람에게 이 개념을 설명한다 상상하고 혼자 설명하며 공부해보려한다.. JVM의 역할과 RunTime Data Area 구조, 그리고 객체가 생성되고 GC로 정리되기까지의 흐름을 남겨보겠다.
JVM 이란?
JVM은 자바 바이트 코드를 실행해주는 가상 머신이다. 운영체제마다 JVM 구현체가 존재하기 때문에, 자바 프로그램은 운영체제에 독립적 이다. 또한 메모리 관리와 GC를 담당한다는 점에서 단순 실행기 이상의 역할을 가진다.
RunTime Data Area
JVM 메모리는 크게 Method Area(클래스 정보), Heap, Stack으로 구성된다.
보통 자바 메모리 구조 = RunTime Data Area 를 의미
-
Method Area(클래스 영역) : 클래스 정보가 저장되는 공간 static 변수, 런타임 상수풀 이 영역은 모든 스레드가 공유
-
스택 영역 : 메서드 호출 단위로 스택 프레임이 쌓이는 공간 지역변수, 매개변수, 반환 주소 등 LIFO 구조 스택은 스레드마다 독립적으로 존재
-
힙 영역 : 객체의 인스턴스가 저장되는 공간 모든 스레드가 공유하며 참조가 끊긴 객체는 GC의 대상 단, GC는 즉시 실행되는게 아니라 JVM이 판단한 시점에 수행
간단한 흐름
1
2
3
4
5
6
7
8
public void main() {
User user = new User();
call(user);
}
public void call(User user) {
user.setName("kim");
}
간단한 코드로 흐름을 봐보자.
- 메인 메서드가 호출되면 스택에 main 프레임이 생성
- new User() 로 생성된 객체는 힙에 올라가고, user 변수에는 객체의 참조값 저장
- call 메서드가 호출되면 새로운 스택 프레임이 생성, user 참조값이 복사되어 전달 (이 때문에 call 메서드 내부에서 객체 필드를 변경하면 호출자도 동일한 객체가 변경)
- 메서드가 종료되면 스택 프레임 제거
- 참조가 끊긴 객체 인스턴스는 GC에 의해 제거
변수의 저장 위치
| 변수 종류 | 저장 위치 | 설명 |
|---|---|---|
| static 변수 | 메서드 영역 | 클래스 로딩 시 1번만 생성, 인스턴스 공유 |
| 인스턴스 변수(클래스의 맴버) | Heap 영역 | 객체 생성 시마다 생성 |
| 지역 변수 | Stack 영역 | 메서드 호출 시 생성, 종료 시 제거 |
기억해야 할 것
자바는 항상 값 복사 방식으로 전달되며, 객체의 경우 참조값이 복사
객체와 인스턴스 둘은 같은 의미지만, 클래스와의 관계를 강조할 때 “인스턴스”라는 표현을 사용한다.
This post is licensed under
CC BY 4.0
by the author.

