카테고리 없음

RunTime시 메모리에 대한 이해 feat. kotlin

hik14 2023. 11. 2. 20:22

 

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)으로 메모리에서 해제된다.