ETC
[Java] 메모리 구조
GreedyBE
2023. 5. 8. 17:21
Java의 메모리 구조
- 자바에서 메모리 구조는 크게 네 가지 영역으로 나뉜다.
- 스택(Stack), 힙(Heap), 메서드(Method Area), 네이티브 메서드 스택(Native Method Stack)
1. 스택 (Stack)
- 스택 메모리는 각 스레드에게 할당되며, 지역 변수와 메서드 호출에 사용한다.
- 메서드가 호출되면 해당 메서드의 프레임이 스택에 Push되고, 메서드가 종료되면 해당 프레임이 Pop된다.
- 메서드 호출 순서에 따라 LIFO(Last-In-First-Out) 방식으로 동작한다.
- 상대적으로 빠르지만 크기가 제한적이기 때문에 큰 데이터를 저장하기에 적합하지는 않다.
2. 힙 (Heap)
- 힙 메모리는 동적으로 할당된 객체를 저장하는 공간이다.
- 자바에서 객체를 생성하면 힙 영역에 할당되며, 가비지 컬렉션(GC)에 의해 더 이상 사용하지 않는 객체가 정리된다.
- 힙 영역의 크기는 JVM의 시작 시점에 결정되며, 필요에 따라 런타임 동안 조정될 수 있다.
- 힙 메모리는 스택 메모리보다 느리고 크기가 크기 때문에, 대규모 데이터를 저장하고 관리하는 데 사용된다.
3. 메서드 영역 (Method Area)
- 메서드 영역은 클래스 정보를 저장하는 공간이다.
- 클래스의 메타데이터, 클래스 변수, 정적 변수, 상수 데이터, 메서드 정보, 생성자 정보 등이 저장된다.
- 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있다.
- 클래스 로더에 의해 로드된 클래스 정보가 이 영역에 할당된다.
※ static
- static이 붙은 자료형인 정적 멤버변수가 해당 메서드 영역에 저장된다.
- 프로그램의 종료 시점까지 메모리에 남아있기 때문에, 시간과 장소에 상관없이 어디서든 사용 가능한 이유이다.
- 따라서 static을 무분별하게 많이 사용하다 보면 메모리가 부족할 우려가 있어, 꼭 필요한 변수에만 사용해야 한다.
4. 네이티브 메서드 스택 (Native Method Stack)
- 네이티브 메서드 스택은 자바가 아닌 다른 언어로 작성된 네이티브 메서드를 위한 메모리 공간이다.
- JNI(Java Native Interface)를 통해 네이티브 코드와 상호작용하는 데 사용된다.
- 네이티브 메서드 스택은 스택 메모리와 비슷한 방식으로 동작하지만, 네이티브 메서드를 위한 공간이라는 점에서 차이가 있다.
이러한 각 영역은 서로 다른 목적을 가지고 있지만, JVM에서 연계하여 동작한다. Stack과 Heap 영역은 객체 참조를 통해 서로 상호작용하며, 메서드 영역은 클래스 정보를 저장하고, 네이티브 메서드 스택은 외부 코드와의 상호작용을 위해 사용된다. 이러한 메모리 구조는 자바 프로그램의 성능과 안정성을 보장하는데 중요한 역할을 수행한다.