ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 힙 할당과 가비지 컬렉터
    프로그래밍언어론 2023. 3. 27. 15:29

    힙기반 할당

    힙객체

    • 프로그램의 수행중에 동적으로 할당되는 객체
    • 프로그램이 공유하는 힙 영역에 할당
    • 프로그램이 요청하면 OS가 할당 및 해지를 담당

    자바에서는 모든 배열과 객체는 힙에 생성된다.
    스택에는 기본타입변수와 참조 변수만 있다.
    배열및 객체의 힙 할당은 new로 한다.

    변수는 그 자체로 메모리 영역을 가지는 변수와 다름 것을 참소하는 변수가 있다.

    • C

    가리키는 대상은 다른 곳에 저장된다.
    지역변수 배열을 가리키면 스택 영역주소 동적할당 객체를 가리키면 힙 여역주소 전역게 있는 객체를 가리키면 정적 영역 주소

    • 자바
      모든 참조 객체는 힙 정적, 스택영역에는 기본값과 참조만

    힙은 임의의 횟수로 할당 과 해지될 수 있는 기억장소의 영역이다.
    지정문, 동적문자열, 리스트또는 집합과 같이 수정 연산에 의해서 크기가 바뀔 수 있어서 동적으로 크키가 결정되는 객체를 다루기 위해 필요하다.

    정작과 트랙영역은 프로그램이 로드될때 요구되는 메모리로 프로그램이 끝날때 까지 독점하는 영역이다.
    프로그램 실행중 필요한 큰 메모리 영역은 힙에 할당하고 다 사용하면 다른 프로그램이 사용한다.

    단편화

    힙 관리 문제는 내부단편화와 외부단편화 문제로 나누어볼 수 있다.

    외부 단편화

    외부 단편화는 활성화된 객체에 할당된 블록들이 힙에 흩어져 있어서 충분한 자유 공간이 있음
    에도 불구하고 다음 요청에 필요한 만큼 충분히 큰 조각이 없는 경우이다.
    힙이 요청을 만족시키는 능력이 시간에 따라 떨어진다(degrade)는 점이
    다. 요청된 공간이 힙의 남아있는 영역의 크기보다 작은데도 만족될 수 없어서 할당 요청이 거부
    되는 사례가 생길 수 있다

    내부 단편화

    힙 메모리를 요구하는 것 보다 더 큰 영역으로 할당하기 때문에 할당된 영역이 빈 공강이 생기는 문제이다.

    관리정책

    관리정책으로는 free block list가 있다.

    처음에는 이 리스트는 전체 힙을 나타내는 단
    하나의 블록만 가진다. 각 할당 요청에 대해 알고리즘은 적절한 크기의 블록을 리스트에서 찾는다.
    선택된 블록이 요청된 것보다 지나치게 크면 그 블록을 두 개로 나누어서 불필요한 부분을
    자유 리스트에 다시 돌려준다. (불필요한 부분이 정해진 최소 기준(threshold) 크기보다 작다면 할
    당된 블록 안에 내부 단편화로 남겨둔다.) 블록이 해제되어 자유 리스트로 돌아오면 우리는 그것
    에 연속된 블록이 비어있는지 검사하여 비어있으면 합친다.


    가바지 컬렉터

    힙 기반의 객체 할당은 프로그램의 특정 연산에 의해 일어난다. 객체를 생성하거나 리스트 끝
    에 객체를 추가하거나 짧은 스트링에 긴 값을 지정하는 등의 연산이다. 해지도 일부 언어(C,
    C++, 파스칼)에서는 명시적이다. 그러나 많은 언어에서 객체는 어떤 프
    로그램 변수에 의해서도 접근할 수 없어지면 묵시적으로 해지된다. 그런 언어의 실행 시간 라이
    브러리는 도달할 수 없는 객체를 찾아서 수집하는 가비지 수집 방식을 제공해야 한다.

    명시적인 해지는 구현이 간단하고 실행속도가 빠르다.
    프로그래머나 객체의 생명주기의 끝을 정확히 표시할 수 있다면 결과는 상당히 빠르다.
    여러 타입을 가지는 언어에서는 이 구현이 매우 어렵다.
    GC가 선호되는 이유는 수동 해지될때 프로그램에서 댕글링참조나, 메모리 누출오류가 생기기 때문이다.
    메모리 누수(leak)에 의해
    힙 공간이 점차로 없어지는 상황이 생길 수 있다. 해지 오류는 찾아내고 고치기가 어렵다고 알려져
    있다. 시간이 지남에 따라 언어 설계자와 프로그래머는 점차로 자동 가비지 수집을 언어의 필수 요
    소로 인식하게 되었다.

    GC의 동작 알고리즘

    기본은 마크, 스윕 앱 컴팩션 알고리즘을 토대로 한다.

    • Mark, Swip 알고리즘

    먼저 Stack을 참조하여 모두 어떤 식으로 참조가 되는지 쭉 훑어본다.(마크를 시킨다.)
    이때 그래프가 그려지게 되는데, 마크가 되지 않은 것들을 모두 제거한 후 마크가 된 것들을 힙의 한 쪽으로 모두 모아서 단편화를 줄인다.

    • 세대 알고리즘

    메모리 할당시 금방만들어진것과 오래된 것들로 나눈다.
    오래된 객체는 오랜시간 객체가 참조된다는 것을 원리로 금방 만들어 진 객체끼리만 마크스윕을 진행한다.

    728x90

    '프로그래밍언어론' 카테고리의 다른 글

    범위규칙  (0) 2023.04.09
    객체의 생명주기  (0) 2023.03.27
    상수에 대한 간단한 고찰  (0) 2023.03.22
    메모리 영역  (2) 2023.03.20
    바인딩  (0) 2023.03.11

    댓글

Designed by Tistory.