JVM이 프로그램을 효율적으로 가동하기 위해 메모리 공간을 Static, Stack 그리고 Heap으로 분리하여 관리한다. 각 공간은 서로 다른 특징을 가지고 있다.
Static 영역 (메서드 영역)
- Static영역에 저장된 변수는 프로그램이 시작하자마자 한 번 생성이 되고, 프로그램이 종료돼야 없어진다.
- 따로 생성을 하지 않아도 계속 사용 및 접근이 가능하다.
- 정적 멤버 변수(static으로 선언된 class변수)가 저장된다.
- java.lang 패키지, import한 패키지 그리고 프로그램 상의 class들이 들어간다.
- 메모리 할당 방식이 '정적'이기에 static영역이라고 한다.
Heap 영역
- 프로그램 실행 중 생성되는 모든 객체들을 저장하는 영역이다.
- 객체 생성 시 메모리가 할당되고, 객체가 더 이상 사용되지 않으면 Garbage Collector에 의해 메모리가 해제된다. 하지만 메모리 누수가 발생할 수 있다.
- static으로 선언되지 않은 class변수(전역 변수)가 저장된다.
- new로 새 변수를 선언하는 것을 '인스턴스(instance)'라고 하며, 생성된 변수를 '인스턴스 변수'라고 한다. 인스턴스 변수 또한 heap에 저장된다.
- '동적'메모리 할당 방식을 사용한다.
Stack 영역
- 메서드 호출시 생성되고 해제시 소멸되는, 중괄호 {} 블럭 내부의 데이터를 저장하는 영역이다.
- 메서드 내에서 선언된 기본 자료형 변수의 값들을 저장한다.
- 메서드 내에서 선언된 참조 자료형 변수는 주소값이 stack에 저장되고, 데이터값은 heap에 저장되어 참조한다.
- 지역 변수, 매개 변수 등 메서드 실행 중 생성되는 임시 데이터를 저장한다.
- LIFO(Last In, First Out) 방식으로 데이터를 저장한다.
예시
public class MemoryExample {
// 정적 변수 (정적 메모리)
static int staticField = 10;
public static void main(String[] args) {
// 지역 변수 (스택 메모리)
int localVariable = 20;
// 객체 생성 (힙 메모리)
MyClass myObject = new MyClass();
// 객체 메서드 호출
myObject.instanceMethod();
// 스택 프레임 해제 (localVariable 해제)
}
}
class MyClass {
// 인스턴스 변수 (힙 메모리)
int instanceField = 30;
public void instanceMethod() {
// 지역 변수 (스택 메모리)
int localVariable = 40;
// ...
// 스택 프레임 해제 (localVariable 해제)
}
}
'TIL : JAVA' 카테고리의 다른 글
[Java] ResponseEntity 를 return할 때, new를 언제 붙이는가? (0) | 2024.05.09 |
---|---|
[Java] 선형 검색 Linear Search (0) | 2024.05.02 |
JDBC 로 MySQL 연결하기 (0) | 2024.03.30 |
JDBC 기초 (0) | 2024.03.28 |
[Java] 상속 (0) | 2024.03.20 |