-
Notifications
You must be signed in to change notification settings - Fork 9
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
GC, ARC의 개념 #101
Comments
GC방식은 메모리 관리를 Garbage Collector라는 것이 프로그램 실행 중에 동적으로 감시하고 있다가, 더이상 사용할 피룡가 없다고 여겨지는 것을 메모리에서 삭제하는 것이다. 런타임에 메모리를 관리한다. 이와 달리, ARC는 프로그램이 실행되고 있는 상태에서 감시하는것이 아니라 코드를 컴파일할 때 컴파일러가 release 코드를 적절한 위치에 넣어주는 개념이다. GC는 항상 메모리를 차지하고 감시해야하기 때문에 프로그램 자체 외에 메모리 사용량이 늘어날 수 밖에 없으며 지속적인 감시를 위해 CPU를 일부 사용해야만 한다. 이에 반해, ARC는 수동으로 개발자가 넣을 코드를 컴파일러가 넣어주는 것이기에 그런 오버헤드에서 자유롭다. ARC는 순환참조 발생 시 영구적으로 메모리가 해제되지 않아 메모리 누수의 위험이 있지만, GC는 순환참조를 해결할 수 있다. GC는 Mark and Sweep이라는 프로세스를 통해 메모리에서 필요없는 부분을 해제한다. GC에는 GC root라는 것이 있는데 힙 외부에서 접근할 수 있는 변수나 오브젝트를 뜻하며 말 그대로 GC의 root 역할을 한다. 이 루트에서 시작하여 참조로 연결된 오브젝트를 모두 mark하고 mark가 끝나면 힙 내부 전체를 돌면서 마크되지 않은 객체들을 모두 해제하는 sweep 과정을 거친다. 즉 루트로부터 닿을 수 있는 노드들을 살려놓고 나머지 객체는 메모리에서 해제되는 것이다. 순환참조는 객체끼리 서로 참조하는데 서로 참조하는 각 객체로부터 외부 참조가 사라져 이 순환참조를 제거할 수 없기 때문에 발생하는 문제이다. 이 때 외부참조가 사라졌다는 것은 GC root로 부터 닿을 수 없다는 것이기 때문에 객체들이 순환참조를 하든 얼마나 많은 노드를 포함하는 그래프의 형태를 띄고 있든 메모리에서 해제된다. |
먼저 GC는 Gargabe Collector의 약자로, 런타임중 동적으로 메모리를 관리합니다. 지속적으로 참조를 추적하다가 더 이상 사용할 필요가 없다고 여겨지는 인스턴스를 메모리에서 해제합니다. 백그라운드에서 객체 그래프를 관리하는 방식으로 동작하며 불확실한 간격으로 처리를 수행합니다. 따라서 정확한 참조해제 시점을 알 수 없고 런타임 시점에 추가적인 리소스가 발생한다는 단점이 있습니다. 하지만 객체 그래프를 확인해서 외부 참조가 존재하지 않음이 확인되면 해당하는 인스턴스를 해제하기 때문에 순환참조 문제가 발생하지 않습니다. ARC는 Automatic Reference Counting의 약자로 힙에 할당된 인스턴스 메모리를 알아서 관리해주는 역할을 합니다. GC와는 다르게 컴파일 타일에 언제 참조되고 해제되는지를 미리 결정하여 런타임에 그대로 처리됩니다. 참조해제 시점이 명확하고 런타임 시점에서 추가적인 리소스가 발생하지 않는다는 장점이 있지만, 순환 참조 발생시 영구적으로 메모리가 해제되지 않을 수 있습니다. |
|
No description provided.
The text was updated successfully, but these errors were encountered: