❗해당 포스팅은 인프런에서 제공해 주는 강의 내용을 개인적으로 정리하였음을 알려드립니다.
자바 메모리 구조는 크게 메서드 영역, 스택 영역, 힙 영역 3개로 나뉜다.
메서드 영역: 클래스 정보 보관.
스택 영역: 실제 프로그램 실행 영역으로 메서드 실행 시 하나씩 쌓이는 공간.
힙 영역: 객체(인스턴스)가 생성되는 영역으로 new 명령어를 사용하면 이 영역을 사용함. 배열도 이 영역을 사용.
스택영역의 예시를 보자
package memory;
public class JavaMemoryMain1 {
public static void main(String[] args) {
System.out.println("main start");
method1(10);
System.out.println("main end");
}
static void method1(int m1){
System.out.println("method1 start");
int cal = m1 * 2;
method2(cal);
System.out.println("method1 end");
}
static void method2(int m2){
System.out.println("method2 start");
System.out.println("method2 end");
}
}
1. main() 실행 : 자바 프로그램을 실행하면 main()을 실행한다. => main()을 위한 스택 프레임이 하나 생성된다.
2. method1() 실행 : main은 method1을 호출한다. => method1() 스택 프레임이 생성된다. (method1()이 들고 있는 지역 변수 및 매개변수들이 스택 프레임에 포함된다. m1=10, cal = 20)
3. method2() 실행 : method1()은 method2()를 호출한다. => method2() 스택 프레임이 생성된다. (method2()가 들고 있는 지역 변수 및 매개변수들이 스택 프레임에 포함된다. m2 = 20)
4. method2() 종료 : method2()가 종료되고, method2() 스택 프레임이 제거된다. 매개변수 m2도 제거된다. method2()가 종료되면서 method2()가 호출된 method1() 시점으로 돌아간다.
5. method1() 종료 : method1() 스택 프레임이 제거된다. 지역변수 m1과 cal도 제거된다. method1()을 호출한 main()으로 돌아간다.
6. main()종료 : 더 이상 호출할 함수가 없고, 스택프레임도 비어진다. => 자바는 프로그램을 정리하고 종료한다.
✅정리
- 자바는 스택 영역을 사용해서 메서드 호출과 지역 변수(매개변수 포함)를 관리한다.
- 메서드를 호출하면 스택 프레임이 계속 쌓이고, 지역변수(매개변수 포함)도 스택 영역에서 관리한다.
- 스택 프레임이 제거되면 지역 변수(매개변수 포함)도 함께 제거된다.
- 스택 프레임이 모두 제거되면 프로그램도 종료된다.
스택 영역과 힙 영역을 같이 사용하는 경우는 다음과 같다.
package memory;
public class Data {
private int value;
public Data(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
package memory;
public class JavaMemoryMain2 {
public static void main(String[] args) {
System.out.println("main start");
method1();
System.out.println("main end");
}
static void method1() {
System.out.println("method1 start");
Data data1 = new Data(10);
method2(data1);
System.out.println("method1 end");
}
static void method2(Data data2) {
System.out.println("method2 start");
System.out.println("data.value=" + data2.getValue());
System.out.println("method2 end");
}
}
1. main() 실행 : 자바 프로그램을 실행하면 main()이 실행되고 main() 스택 프레임이 생성된다. method1()을 호출한다.
2. method1() 실행 : method1() 스택 프레임이 생성되고, 지역변수인 data1도 스택 프레임에 포함된다. 이때 new Data(10)을 사용해서 힙 영역에 Data 인스턴스를 생성한다. 그러면 data1에 인스턴스의 참조값을 보관한다. (data1=x001) method2()를 호출한다.
3. method2() 실행 : method1()에서 넘어온 참조값을 data2에 보관한다. (data2=x001) data1과 data2는 같은 인스턴스를 참조하게 된다.
4. method2() 종료 : method2()의 스택 프레임이 제거되면서 data2도 제거된다. method1()로 돌아간다.
5. method1() 종료 : method1()의 스택 프레임이 제거되면서 data1도 제거된다. main()으로 돌아간다.
6. method1() 종료 직후 : method1()과 data1이 제거되면서 x001참조값을 가진 Data 인스턴스를 참조하는 곳이 모두 사라지게 된다. 결과적으로 프로그램에서 더 이상 사용하지 않는 객체가 되고 불필요한 메모리만 차지하게 된다. 이때 GC(가비지 컬렉션)은 이렇게 참조가 모두 사라진 인스턴스를 찾아서 메모리에서 제거해 주는 역할을 한다.
'Back-end > Java' 카테고리의 다른 글
[Java] static 메서드 (1) | 2024.12.20 |
---|---|
[Java] static 변수 (0) | 2024.12.16 |
[Java] 기본형과 참조형 (3) | 2024.12.03 |
[Java] 배열의 도입 (2) | 2024.11.27 |
[Java] 클래스의 도입 (5) | 2024.11.25 |