-
힙 할당과 가비지 컬렉터프로그래밍언어론 2023. 3. 27. 15:29
힙기반 할당
힙객체
- 프로그램의 수행중에 동적으로 할당되는 객체
- 프로그램이 공유하는 힙 영역에 할당
- 프로그램이 요청하면 OS가 할당 및 해지를 담당
자바에서는 모든 배열과 객체는 힙에 생성된다.
스택에는 기본타입변수와 참조 변수만 있다.
배열및 객체의 힙 할당은 new로 한다.변수는 그 자체로 메모리 영역을 가지는 변수와 다름 것을 참소하는 변수가 있다.
- C
가리키는 대상은 다른 곳에 저장된다.
지역변수 배열을 가리키면 스택 영역주소 동적할당 객체를 가리키면 힙 여역주소 전역게 있는 객체를 가리키면 정적 영역 주소- 자바
모든 참조 객체는 힙 정적, 스택영역에는 기본값과 참조만
힙은 임의의 횟수로 할당 과 해지될 수 있는 기억장소의 영역이다.
지정문, 동적문자열, 리스트또는 집합과 같이 수정 연산에 의해서 크기가 바뀔 수 있어서 동적으로 크키가 결정되는 객체를 다루기 위해 필요하다.정작과 트랙영역은 프로그램이 로드될때 요구되는 메모리로 프로그램이 끝날때 까지 독점하는 영역이다.
프로그램 실행중 필요한 큰 메모리 영역은 힙에 할당하고 다 사용하면 다른 프로그램이 사용한다.단편화
힙 관리 문제는 내부단편화와 외부단편화 문제로 나누어볼 수 있다.
외부 단편화
외부 단편화는 활성화된 객체에 할당된 블록들이 힙에 흩어져 있어서 충분한 자유 공간이 있음
에도 불구하고 다음 요청에 필요한 만큼 충분히 큰 조각이 없는 경우이다.
힙이 요청을 만족시키는 능력이 시간에 따라 떨어진다(degrade)는 점이
다. 요청된 공간이 힙의 남아있는 영역의 크기보다 작은데도 만족될 수 없어서 할당 요청이 거부
되는 사례가 생길 수 있다내부 단편화
힙 메모리를 요구하는 것 보다 더 큰 영역으로 할당하기 때문에 할당된 영역이 빈 공강이 생기는 문제이다.
관리정책
관리정책으로는 free block list가 있다.
처음에는 이 리스트는 전체 힙을 나타내는 단
하나의 블록만 가진다. 각 할당 요청에 대해 알고리즘은 적절한 크기의 블록을 리스트에서 찾는다.
선택된 블록이 요청된 것보다 지나치게 크면 그 블록을 두 개로 나누어서 불필요한 부분을
자유 리스트에 다시 돌려준다. (불필요한 부분이 정해진 최소 기준(threshold) 크기보다 작다면 할
당된 블록 안에 내부 단편화로 남겨둔다.) 블록이 해제되어 자유 리스트로 돌아오면 우리는 그것
에 연속된 블록이 비어있는지 검사하여 비어있으면 합친다.가바지 컬렉터
힙 기반의 객체 할당은 프로그램의 특정 연산에 의해 일어난다. 객체를 생성하거나 리스트 끝
에 객체를 추가하거나 짧은 스트링에 긴 값을 지정하는 등의 연산이다. 해지도 일부 언어(C,
C++, 파스칼)에서는 명시적이다. 그러나 많은 언어에서 객체는 어떤 프
로그램 변수에 의해서도 접근할 수 없어지면 묵시적으로 해지된다. 그런 언어의 실행 시간 라이
브러리는 도달할 수 없는 객체를 찾아서 수집하는 가비지 수집 방식을 제공해야 한다.명시적인 해지는 구현이 간단하고 실행속도가 빠르다.
프로그래머나 객체의 생명주기의 끝을 정확히 표시할 수 있다면 결과는 상당히 빠르다.
여러 타입을 가지는 언어에서는 이 구현이 매우 어렵다.
GC가 선호되는 이유는 수동 해지될때 프로그램에서 댕글링참조나, 메모리 누출오류가 생기기 때문이다.
메모리 누수(leak)에 의해
힙 공간이 점차로 없어지는 상황이 생길 수 있다. 해지 오류는 찾아내고 고치기가 어렵다고 알려져
있다. 시간이 지남에 따라 언어 설계자와 프로그래머는 점차로 자동 가비지 수집을 언어의 필수 요
소로 인식하게 되었다.GC의 동작 알고리즘
기본은 마크, 스윕 앱 컴팩션 알고리즘을 토대로 한다.
- Mark, Swip 알고리즘
먼저 Stack을 참조하여 모두 어떤 식으로 참조가 되는지 쭉 훑어본다.(마크를 시킨다.)
이때 그래프가 그려지게 되는데, 마크가 되지 않은 것들을 모두 제거한 후 마크가 된 것들을 힙의 한 쪽으로 모두 모아서 단편화를 줄인다.- 세대 알고리즘
메모리 할당시 금방만들어진것과 오래된 것들로 나눈다.
오래된 객체는 오랜시간 객체가 참조된다는 것을 원리로 금방 만들어 진 객체끼리만 마크스윕을 진행한다.728x90