자바 메모리 구조
Deep Dive
자바 실제 메모리 구조
메서드 영역, 스택 영역, 힙 영역으로 총 3가지 영역으로 나뉜다.
메서드 영역
메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다.
이 영역은 프로그램의 모든 영역에서 공유한다.
어떤 정보가?
- 클래스 정보 : 클래스 실행 코드(바이트 코드), 필드, 메서드 생성자 코드
- static 영역 : static 변수들을 보관
- 런타임 상수 풀 : 공통 리터럴 상수를 보관
스택 영역
스택 영역은 자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등이 포함된다.
- 스택 프레임 : 스택에 쌓이는 네모 박스 하나가 스택 프레임 (메서드 호출시 하나의 스택 프레임이 쌓이고, 메서드 종료시 해당 스택 프레임이 제거됨)
엄밀히 말하면 스택 영역은 각 쓰레드별로 하나의 실행 스택이 생성된다.
힙 영역
힙 영역은 객체(인스턴스)와 배열이 생성되는 영역이다. 가비지 컬렉션(GC)이 이루어지는 주요 영역으로, 참조되지 않는 객체는 GC에 의해 제거된다.
메서드 코드
Data라는 클래스로 힙 영역에 2개의 인스턴스를 만들어주었다. 각각 인스턴스는 내부의 변수와 메서드를 가진다.
같은 클래스로부터 생성된 인스턴스는 내부 변수 값은 다를 수 있지만, 메서드는 공통된다.
즉, 인스턴스가 생성될 때, 인스턴수 변수는 메모리에 할당이 되지만, 메서드에 대한 새로운 메모리 할당은 하지 않는다.
왜냐하면 메서드는 메서드 영역에서 공통으로 관리되고 실행되기 때문이다.
인스턴스의 메서드를 호출할 경우 메서드 영역에 있는 코드를 불러와서 실행하게 된다.
메서드는 필드 변수와 달리 불변하기 때문에 인스턴스 생성할 때마다 새로운 메모리에 할당해주는 것은 굉장한 메모리 낭비이다.
한번 선언해두고 공유하며 사용하는 것이 컴퓨터 리소스 차원에서 훨씬 효율적이다.
'Java' 카테고리의 다른 글
JVM 정복하기 (0) | 2025.01.09 |
---|---|
[Effective Java] 생성자 대신 팩터리 메서드를 고려하라 (0) | 2024.12.11 |
Objects.equals() vs equals() (0) | 2024.09.25 |
Object.equals() 메서드가 정말 null-safe한가? (0) | 2024.09.25 |
equals()메소드를 비교하는 대상이 null인 경우 (0) | 2024.09.25 |