(25/08/07)메모리구조(Memory Structure)

허윤·2025년 8월 6일


이미지 출처
메모리(Ram) = 실행중인 프로그램의 명령어와 데이터를 저장
CPU = 해당 메모리에 저장된 명령어를 읽어들이고 명령을 실행, 해석하는 부품
f == 함수 ,r == 결과, 정수 = 변수

메모리 실행과정 = {f([1]+[2]),100,120} => {f,100,120,r(220)}
순서는 메모리에 올려져있는걸 CPU가 읽고 다음 메모리에 기입하는 형태

  • Q : 그렇다면 함수도 메모리에 저장 되는 것으로 보이는데 스텍영역으로 사용 후 회수가 되는걸까요?
    • A : O(다만 함수 호출 자체는 메모리를 생성하진 않음 함수가 끝날때 매개변수와 지역변수 해제
  • Q(1번 케이스가 stack영역일시) : Action같은 delegate 기반의 객체들을 필드로 선언두면 함수의 포인터를 저장하는 인스턴스로 알고있습니다.
    제가 기억하기로는 참조형 == 힙영역, 값타입 == 스텍영역 으로 기억하고있는데 함수포인터는 실행 시 스텍영역을 할당받는건가요?
    • A : 힙메모리에 할당이 되긴함
  • 실행에 스텍영역을 받는다면 GC를 호출시마다 실행하진 않을 것 같고 참조형이니 저장은 힙, 실행은 스텍 이렇게 이해하면 될지요?
    • A : O
  • 또 제가 작업할때 구조때문에 함수 포인터를 자주 쓰는편인데 저장에 힙영역을 할당받는다면 사용 빈도를 줄이는게 좋을 까요?
    • A : 구조우선, 메모리도 중요하나 협업 가능한 코드를 짜는것이 더 중요

  • 코드영역
    • readOnly, const와 컴파일된 코드들이 저장되는 공
  • 데이터영역
    • static이나 field같은 변수를 저장하는 공간
  • 스텍 영역
    • 지역변수,매개변수,struct
    • 함수 실행 시 할당되는 지역,매개변수는 함수 종료와 함께 메모리 해제
  • 힙 영역
    • 이 공간에 메모리 할당하는것이 동적할당
    • 참조형을 저장하는 공간(new키워드로 생성하는 객체)
    • 만일 지역번수로 참조형을 사용한다면?
      • 생성 자체는 힙영역에 할당(본체), 지역변수는 포인터를 가져온 스텍 메모리 영역, 없으면 그냥 GC수거
      • Q : 그렇다면 지역변수에서도 사용이 끝난 힙 객체들은 null로 설정해두어야 하나요?
  • GC (Garbage Collection)

  • 장점

    • 자동 메모리 관리
    • 메모리 누수 방지
    • 생산성 향상 = 매번 해제해주지 않아도 된다
  • 단점

    • 메모리 관리 오버헤드 : GC 호출에도 메모리가 사용되므로 성능저하가 생길 수 있음
    • 예측 불가능한 실행 시점 : GC 호출 시점이 예측하기 어렵다
  • GC 를 피하는 방법

    • ObejctPooling 사용
    • 구조체 사용
    • 큰 객체 사용 지양(85KB 이상의 객체는 LOH에 할당되므로 사용 최소화와 분할 객체 사용이 필요)
    • 임시 객체 생성 최소화 및 명시적 해제
  • ETC

    • GC는 System.GC로 호출이 가능하나 고비용의 호출이라 많이 쓰진 않는다.
profile
C# 클라이언트 프로그래밍 지망

0개의 댓글