-
C# 에서는 순환 참조 문제를 어떻게 해결할까프로그래밍/잡지식 2017. 9. 1. 00:29순환참조에 의한 메모리 릭이란?shared_ptr과 같은 레퍼런스 카운팅 방식의 메모리 핸들링에서 발생. 서로다른 객체 a,b가 서로 참조하고 있을 때 각각 서로에 대한 reference count가 1이라 자동으로 지워지지 않은 상황. c++에서는 한쪽을 weak_ptr을 사용해 방지.C#의 Garbage Collection참조 : https://www.red-gate.com/simple-talk/dotnet/.net-framework/understanding-garbage-collection-in-.net/
- c#에서는 일정한 크기의 메모리(Managed memory)를 미리 잡아 놓고, 그 안에서 객체가 생성 될 때마다 차례로 메모리를 할당한다. 할당하다가 Managed memory가 꽉찬 경우 GC가 실행된다. 이때문에 GC가 도는 경우에 프로세스가 멈추는 현상이 발생하며, 유니티에서는 이 정도가 심하다.
할당된 메모리를 3가지 세대로 나누어 관리하는데, 최근에 할당된 메모리일 수록 낮은 세대이며, 낮은세대부터 할당 해제 한다.
할당 해제 조건: 모든 객체가 쓰레기라고 가정하고 루트 목록을 돌면서 루트가 참조하고 있는 힙 객체들을 조사한다. 이 과정에서 루트들에게 참조되지 않는 모든 객체는 지운다.
루트란?
참조 : https://stackoverflow.com/questions/8458886/what-is-a-rooted-reference
현재 실행되는 함수의 지역변수
static변수
finalizer가 있는 객체
GC가 시작되는 조건
시스템의 물리 메모리가 너무 작은 경우
managed heap에 할당된 메모리가 thresholde를 넘은 경우(threshold는 계속 변동)
System.GC.Collect를 호출한 경우.(권장X)
순환참조를 잡을수 있는 이유
a,b가 서로를 참조하고 있을 때, a가 지워지면 a는 root가 아니므로 root인 b가 참조하고 있는 동안만 메모리를 유지한다. b가 지워지면 어떤 root도 a를 참조하지 않으므로 a의 메모리는 지워진다.
'프로그래밍 > 잡지식' 카테고리의 다른 글
Google Play Login 구현 과정 (0) 2016.11.21 visual studio에서 동적, 정적 라이브러리 만들기 (0) 2016.04.30 visual studio에서 동적, 정적 라이브러리 사용 (0) 2016.04.30