Java 메모리 구조
Static 키워드를 알아보기 전 자바 메모리 구조부터 알아볼 필요가 있다.
자바 메모리는 JVM에서 구조를 가지고 동작한다.
구조에 대한 영역은 3개로 나누어진다.
- 메소드 영역: 클래스에 대한 정보가 담겨 있다.
- 스택 영역: 실제 프로그램에 실행 영역이다. 메소드를 실행할 때 쌓이는 구조이다.
- 힙 영역: 인스턴스가 생성되는 영역이다. 배열과
new
키워드가 이 영역을 사용한다.
메모리 구조 요약

그림은 method() 메소드 코드가 Foo 클래스를 new 키워드로 두 번 인스턴스를 생성하고 Bar 클래스 또한 두 번 인스턴스를 main 에서 실행하였을 때 Method, Stack, Heap 영역이 어떻게 만들어지는지 확인하는 그림이다.
- Method 영역에서 Foo, Bar 클래스 정의
- Stack 영역에서 main 프레임을 실행하고 위에 method() 프레임 실행
- method() 에는 Foo, Bar 인스턴스를 각각 두 번 생성하는 코드를 실행
- Heap 영역에는 총 4개의 인스턴스를 메모리에서 생성한다.
메모리 구조 실제로 담기는 정보
메모리 구조 세 가지에서 실제로 담기는 데이터를 알아보도록 한다.
- Method Area: 프로그램 실행에 필요한 공통 데이터를 관리. 공통 데이터는 모든 영역에서 공유함
- 클래스 정보: 자바 실행에 필요한 바이트 코드를 담고 있다. 클래스, 메소드와 생성자 코드 클래스에 대한 정보가 있다.
- static 영역:
static
변수들을 보관한다. - 런타임 상수 풀: 프로그램 실행에 사용하는 리터럴 상수를 갖고 있다. 자바 코드에 "hello", "world" 리터럴 문자가 있는 경우 공통으로 묶어서 관리한다. 자바을 효율적으로 관리하기 위한 상수들도 관리한다.
- Stack Area: 자바 실행시 실행 스택이 생성한다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메소드 호출 정보 등을 포함되어 있다.
- 스택 프레임: 메소드를 호출할 때마다 쌓이거나 해당 메소드가 종료되면 스택 프레임을 제거한다.
- 멀티 스레드를 사용한 경우 실행 스택이 스레드 개수만큼 생성한다.
- Heap Area: 객체(인스턴스)와 배열이 생성되는 영역. 가비지 컬렉션(GC)가 이루어지는 영역으로 더 이상 참조되지 않는 객체와 배열은 제거된다.

메모리 각 영역은 다음과 같이 저장되어 사용한다.
- 지역 변수: Stack Area에 저장한다.
- 정적 변수: Method Area에 저장한다.
- 인스턴스 변수: Heap Area에 저장한다.
런타임에서 인스턴스를 여러개 만든 경우 메모리 사용량
자바에서 new 키워드로 특정 클래스로 인스턴스를 여러개 만든 경우, 만든 인스턴스의 각각 변수와 메소드를 갖게 된다. 같은 클래스로 만들어진 인스턴스는 내부의 변수 값은 다르지만, 메소드는 공통된 코드를 갖고 있다. 즉, Heap 영역에는 변수에 대한 메모리만 저장하고, 메소드에 대한 새로운 메모리는 발생되지 않고 메소드 영역에서 관리하고 공통된 코드를 공유한다.