2장에서는 프로그램이 실행 될때 메모리를 어떻게 이용하는지를 설명하고 있다.
[그림 1] 프로그램이 메모리를 이용하는 방식
그림1은 하나의 프로그램이 실행될 때 메모리를 사용하는 방식을 간략하게 보여준다. 객체 지향 프로그램에서는 데이터 저장 영역을 다시 세 개의 영역으로 분할해서 사용한다.
[그림 2]
그림2와 같이 데이터 저장 영역은 스태틱(Static), 스택(Stack), 그리고 힙(Heap) 영역으로 구분 된다. 각 영역에 대해 간략하게 설명을 하면 다음과 같다.
스태택 영역 : 전역 변수와 static변수가 할당 되는 영역, 프로그램의 시작과 동시에 할당되고 프로그램이 종료되어야 메모리에서 소멸됨
스택 영역 : 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역, 함수 호출이 완료되면 사라짐
힙 영역 : 동적으로 할당된 변수
이제 간단한 코드를 가지고 메모리에서 어떤 일이 일어나는지 살펴보자.
[그림 3] 메모리 변화를 보기위한 간단한 코드
JRE는 먼저 프로그램 안에 main() 메서드가 있는지 확인을 하고, 확인이 되면 JVM을 부팅한다. 부팅된 JVM은 목적 파일을 받아 실행한다. JVM은 모든 자바 프로그램이 반드시 포함하는 java.lang 패키지를 스태틱 영역에 가져다 놓는다. 다음으로 JVM은 개발자가 적성한 모든 클래스와 임포트 패키지를 스태틱 영역에 가져다 놓는다. 여기까지의 과정을 전처리 과정이라 한다.
[그림4] 6번째 줄을 실행하기 전 메모리
코드를 보면 m변수에 static 키워드가 붙어있기 때문에 스태틱 영역에 변수 공간이 할당된다. test1클래스 안에 정의됐으니 해당 클래스가 스태틱 영역에 배치될 때 그 안에 m변수가 클래스의 멤버로 저장된다.
[그림5] 8번째 줄을 실행한 후 메모리
다음은 main() 메서드의 스택 프레임이 stack영역에 할당된다. 그리고 메서드의 인자 args를 저장할 변수 공간을 스택 프레임의 맨 밑에 확보한다. 그리고 나서 main() 메서드 스택 프레임 안에 밑에서 부터 차곡차곡 변수들이 저장된다.
[그림6] 17번째 줄을 실행한 후 메모리
10번째 줄에서 sum()메서드를 호출하고 있다. 제어 흐름이 15번째 줄로 이동할 것이다.그림 6에서 볼 수 있듯이 sum()메서드 스택 프레임에는 반환값을 저장할 변수 공간이 맨 아래, 그 다음으로 인자를 저장할 변수 공간, 그리고 마지막으로 메서드의 지역 변수가 자리 잡는다.
[그림 7] 20번째 줄 실행 후 메모리
18번째 줄을 실해하고 나면 result변수에 35라는 값이 저장될 것이다. 그리고 20번째 줄이 끝나면 return 변수에 35라는 값이 복사 될 것이다.
[그림 8] 10번째 줄 실행 후 메모리
sum() 메소드의 닫는 중괄호를 만나면 sum() 메서드 스택 프레임은 변환값을 주면서 스택에서 사라진다. 결국 변수 m에는 35라는 값이 저장된다. 12번째 줄에 있는 System.out.println(m) 구문은 현재 보고 있는 메모리(Static, Stack, Heap)에 변화를 주지 않는다.
이후에 main() 메서드의 닫는 중괄호를 만나면 main() 메서드의 스택 프레임이 소멸되고, main() 메서드가 끝나면 JVM이 종료되면서 메모리도 사라지게 된다.
이제 실제로 이클립스를 이용하여 메모리 스택 영역을 살펴보자.
[그림 9] 8번째 줄을 실행한 후 메모리
8번째 줄을 실행한 후 메모리 이다. 가장 최측에서 스택 영역에 main() 메서드 스택 프레임이 생성된 것을 확인할 수 있고, Variables에서 main() 메서드 스택 프레임의 변수들을 확인할 수 있다. Expresstion에는 스태틱 변수를 확인할 수 있다. 예상했던 대로 변수 i와 k에 각각 10, 25의 값이 저장되어 있는 것을 확인할 수 있다.
[그림 10] 18번째 줄을 실행한 후 메모리
스택 메모리에 sum() 메서드 스택 프레임이 생성된것을 확인할 수 있고, 인자와 변수에 예상했던 값들이 저장되어 있는 것을 확인할 수 있다.
[그림 11] 10번째 줄을 실행한 후 메모리
sum() 메서드의 닫는 중괄호를 만나면서 sum() 메서드 스택 프레임이 사라진 것을 확인할 수 있다. 또한 10번째 줄이 실행되면서 static 변수 m에 반환된 값인 35가 저장된 것을 확인할 수 있다.
[인용 출처]
1. 그레이트쪼, https://greatzzo.tistory.com/57