RunTime시 메모리에 대한 이해 feat. kotlin
RunTime시 Ram(메모리)에 코드가 어떻게 저장되고 사용되는지 알아보자
* 기본적으로 알아야 하는 지식.
- val / var (kotlin에서 사용하는 key word)
val - 변경 불가능한 참조를 저장하는 변수(초기화 이후 저장된 것을 바꿀수 없다.)
var - 변경 가능한 참조를 저장하는 변수.
- args / params
params - 함수를 정의할때, Input 값으로 받을 타입와 갯수를 정의한 함수의 시그니쳐중 하나.
args - 정의된 함수를 호출할때, 실제로 넣어주는 값.
/*
Function definition
a, b parameters
*/
fun add(a: Int, b: Int): Int{
val c = a + b
return c
}
// main 함수 - 프로그램 시작의 진입점
fun main() {
// Function call (4, 10 argument)
add(4, 10)
}
- 메모리의 영역
실제 메모리의 공간을 추상화하여 보자!
JVM은 실행될 클래스 파일(xxx.class)을 메모리에 로드 후 초기화 작업을 수행
1. Code 영역
- 실제 코드(기계어)가 저장되는 곳.
- CPU에서 각 줄의 명령어를 순차적으로 실행하며, 프로그램 시작부터 끝까지 사용된다.
2. Data 영역
- 전역(Global) 변수, 정적(Static) 변수가 프로그램 시작과 초기화 된다. 종료후 해제됨.
- 프로그램 전반에 걸쳐서 사용할 데이터를 저장하는 곳이다.
* Bss 영역에는 초기화되지 않은 전역 변수가 저장
3. Heap 영역 (RunTIme에 동적으로 할당되는 영역)
- 사용자의 Application 사용방법에 따라 생성된 객체를 저장한다.
- C언어와 같이 개발자가 직접 할당 및 해제가 가능하기도 하지만 JVM위에서 실행되는(java, kotlin)는
Garbage Collector가 특정 기준을 가지고 자동으로 메모리공간을 해제 시킨다.
- 상속관계가 있는 객체를 생성 및 초기화를 하면 모두다 이곳에 저장됨. (java, kotlin)
4. Stack 영역 (Complie에 크기가 정해진다.)
- main function(프로그램의 시작점)을 기준으로 호출되는 Function Call(객체의 Method 포함)하여
함수를 실행에 필요한 것(local 변수, 매개변수, 리턴 값)들을 저장한다.
- 각 함수별로 stack segment로 나누어져서 저장되었다가 함수 호출이 종료되면, 호출된 역순(LIFO)으로 메모리에서 해제된다.