개발 공부/CS

[메모리] Heap과 Stack (with Kotlin)

yong_DD 2023. 8. 24. 18:36

메모리에는 Code, Data, Heap, Stack 4가지 영역이 있습니다.

 

1. Code (Text)

코드를 실행하기 위해 저장된 영역으로 작성한 프로그램 코드가 저장되는 영역입니다.

저장된 명령어를  CPU에서 하나씩 가져가서 처리를 하게 됩니다.

 

2. Data

전역변수정적변수(Static)가 할당되는 영역입니다.

프로그램 시작과 함께 할당되고 종료되기 전까지 메모리에 남아있습니다.

var a : Int = 1  // 초기화된 변수 영역 
lateinit var b : String // 초기화 되지 않은 변수 영역 

const val c = "Hello" // 정적 변수 (kotlin에는 static을 사용하지 않음)

// Java Code----
public static final String C = "Hello";
// -------


fun main(){
}

데이터는 2가지로 나뉘게 됩니다.

1. 초기화된 변수 영역 .data(initialized data segment) 

2. 초기화 되지 않은 변수 영역 .bss(Block Started by Symbol)

 

3. Stack

지역변수매개 변수가 저장되는 영역입니다.

데이터가 PUSH, POP 방식으로 들어갔다 나오고 순서는 후입선출(LIFO) 방식에 따라 동작하게 됩니다.

fun main() {
    println(sum(5))
}

fun sum(end:Int) : Int { // end : 매개변수
    var sum = 0 // 지역변수
    for(i in 1..end) {
       sum += calculate(i)
    }
    return sum
}

fun calculate(sum : Int) : Int  // sum : 매개변수
	= sum * 2

위와 같은 코드가 있다고 할 때 아래와 같이 동작하게 됩니다.

 

push로 1,2,3 순차적으로 쌓이게 되고 for문이 끝날때까지 2~4를 통해 calculate가 push, pop되다가 완료된 후 sum까지 pop되어 5번처럼 되게 됩니다.

 

4. Heap

사용자가 직접 관리할 수 있는 메모리 영역으로 선입선출(FIFO) 구조입니다.

Stack보다 속도가 더 빠르다는 장점이 있지만 할당하고 해제하는 것이 많은 비용을 요하기 때문에 자주 할당하지 않도록 해야합니다.

data class TestData (
    var name : String,
    var data : String
)
val testData = TestData("김땡땡","가나다라") // 클래스 인스턴스는 Heap, 변수는 Stack

fun main(arg: Array<String>) {
    val size = 5
    val array = arrayOfNulls<Int>(size) 
}

size라는 변수는 Int이기 때문에 4바이트라고 크기는 알 수 있지만 컴파일 시 값은 알 수 없고, array의 사이즈도 마찬가지로 알 수 없습니다.

C언어의 경우 malloc()과 calloc()을 사용하여 힙 영역에 메모리를 동적으로 할당해 주는데 ,

사용하고 난 후 메모리 해제를 해주지 않으면 memory leak이 발생하게 됩니다

(kotlin, java의 경우 gc(가비지 컬렉션)가 처리해 주게 됩니다.)

 

자세한 부분은 여기를 참고해주세요.

 

[참고 : JVM에서의 구조]

JVM에서의 Heap은 복잡한 타입의 변수 클래스 타입, Interface 타입, ArrayType의 변수들이 저장됩니다.

Stack은 Primitive타입의 변수들만 저장되게 되고, 나머지는 heap에 저장되고 그 주소값이 저장되게 됩니다.

 

위의 코드의 경우를 참고하면 testData의 주소값은 Heap에 저장이 되고 Stack에는 testData와 heap의 주소값이 저장되게 됩니다.(testData의 값이 있는 heap의 주소값이 저장)

 


참고 및 출처

https://yaboong.github.io/java/2018/05/26/java-memory-management/

https://kotlinworld.com/310

https://st-lab.tistory.com/198

https://lxxyeon.tistory.com/70

https://electronic-hwan.tistory.com/entry/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD-Stack-Heap

http://www.tcpschool.com/c/c_memory_structure