Version: Unity 6.0 (6000.0)
언어 : 한국어
가비지 컬렉터 개요
가비지 컬렉션 비활성화

점진적 가비지 컬렉션

점진적 GC(가비지 컬렉션)는 가비지 컬렉션 프로세스를 여러 프레임에 걸쳐 분산합니다. 이는 Unity의 기본 가비지 컬렉션 동작입니다.

점진적 가비지 컬렉션을 활성화하려면 Player Settings를 열고 Use incremental GC를 활성화합니다. 이는 기본적으로 활성화되어 있습니다.
점진적 가비지 컬렉션을 활성화하려면 Player Settings를 열고 Use incremental GC를 활성화합니다. 이는 기본적으로 활성화되어 있습니다.

Unity의 가비지 컬렉터는 Boehm–Demers–Weiser 가비지 컬렉터를 사용합니다. 기본적으로 점진적 모드에서 이를 사용하는데, 가비지 컬렉터가 메인 CPU 스레드(stop-the-world 방식의 가비지 컬렉션)를 중지하는 대신 워크로드를 여러 프레임에 분할하여 관리되는 힙의 모든 오브젝트를 처리합니다. 즉, Unity는 애플리케이션 실행을 길게 한 번 중단하는 대신 짧게 중단하여 가비지 컬렉터가 관리되는 힙의 오브젝트를 처리하도록 합니다.

점진적 모드는 전체적으로 가비지 컬렉션 속도를 높이는 것은 아니지만, 워크로드를 여러 프레임에 분산하기 때문에 GC 관련 성능 부하 급증이 감소합니다. 이러한 중단은 프로파일러 창의 프레임 시간 그래프에 가파른 급증으로 나타나기 때문에 GC 스파이크라고 합니다.

점진적 모드(메뉴: Edit > Project Settings > Player > Other Settings > Configuration > Use Incremental GC)를 비활성화하는 경우 가비지 컬렉터가 컬렉션을 전달할 때 전체 힙을 검사해야 합니다. 가비지 컬렉터가 실행될 때마다 메인 CPU 스레드를 멈추기 때문에 이를 stop-the-world 방식 가비지 컬렉션이라고 합니다. 관리되는 힙의 모든 오브젝트를 처리한 후에만 실행을 재개합니다. 이로 인해 애플리케이션의 성능에 영향을 미치는 GC 스파이크가 발생할 수 있습니다. 또한 가비지 컬렉터는 압축되지 않으므로 Unity는 메모리에서 오브젝트 간의 빈 공간을 없애기 위해 오브젝트를 재배포하지 않습니다.

중요: 웹 플랫폼은 점진적 가비지 컬렉션을 지원하지 않습니다.

점진적 가비지 컬렉션이 비활성화되면 Unity가 가비지 컬렉션을 수행하기 위해 프로그램 코드를 실행하지 않을 때 GC 스파이크가 발생합니다. 이러한 지연은 가비지 컬렉터가 처리해야 하는 할당 수와 애플리케이션이 실행 중인 플랫폼에 따라 수백 밀리초까지 지속될 수 있습니다.

가비지 컬렉터가 애플리케이션의 실행을 일시 중지할 때 원활한 애니메이션에 필요한 일관된 프레임 속도를 유지하기 어렵기 때문에 게임과 같은 실시간 애플리케이션에서는 문제가 됩니다.

점진적 가비지 컬렉션 예제

다음 프로파일러 스크린샷은 점진적 가비지 컬렉션이 프레임 속도 문제를 줄이는 방법을 보여 줍니다.

점진적 GC가 활성화된 프로파일링 세션
점진적 GC가 활성화된 프로파일링 세션
점진적 GC가 비활성화된 프로파일링 세션
점진적 GC가 비활성화된 프로파일링 세션

상단 프로파일링 세션에서는 점진적 GC가 활성화되어 있습니다. 가비지 컬렉터가 가비지 컬렉션 작업을 여러 프레임에 걸쳐 분산하고 각 프레임의 작은 시간 조각(노란색 VSync 트레이스 바로 위에 있는 진한 녹색 테두리)을 사용하기 때문에 애플리케이션의 프레임 속도는 60fps로 일정합니다.

하단 프로파일링 세션에서는 점진적 GC가 비활성화되어 있으며, GC 스파이크가 명확히 보입니다. 이 스파이크는 완만한 60fps 프레임 속도를 중단하고 가비지 컬렉션이 발생하는 프레임을 60fps로 유지하는 데 필요한 16밀리초 제한을 초과하도록 만듭니다.

애플리케이션이 VSync 또는 Application.targetFrameRate를 사용하는 경우 Unity는 가비지 컬렉션에 할당된 시간을 사용 가능한 남은 프레임 시간에 따라 조정합니다. 이렇게 하면 Unity가 대기하는 데 소요되는 시간만큼 가비지 컬렉션을 실행할 수 있으며, 성능에 미치는 영향을 최소화하며 가비지 컬렉션을 수행할 수 있습니다.

참고: VSync CountDon’t Sync가 아닌 옵션으로 설정(프로젝트의 Quality settings 또는 Application.VSync 프로퍼티)하거나 Application.targetFrameRate 프로퍼티를 활성화하면, Unity는 특정 프레임이 끝날 때 남은 유휴 시간을 점진적 가비지 컬렉션에 자동으로 사용합니다.

점진적 가비지 컬렉션 동작을 더 정확하게 제어하려면 Scripting.GarbageCollector 클래스를 사용하면 됩니다. 예를 들어 VSync나 타겟 프레임 속도를 사용하고 싶지 않은 경우 프레임이 끝나기 전에 사용할 수 있는 시간을 직접 계산하고 해당 시간을 가비지 컬렉터에 제공하여 사용할 수 있습니다.

점진적 가비지 컬렉션 비활성화

점진적 가비지 컬렉션은 가비지 컬렉터가 이 모드에서 작업을 분할하면 마킹 단계도 분할하기 때문에 애플리케이션에서 문제가 될 수 있습니다. 마킹 단계는 가비지 컬렉터가 관리되는 모든 오브젝트를 스캔하여 사용 중인 오브젝트와 정리할 수 있는 오브젝트를 확인하는 단계입니다.

마킹 단계를 분할하는 것은 오브젝트 간의 레퍼런스의 대부분이 작업 슬라이스 간에 변경되지 않는 경우에 적합합니다. 하지만 오브젝트 레퍼런스가 변경되면 가비지 컬렉터는 다음 반복 작업에서 해당 오브젝트를 다시 스캔해야 합니다. 이렇게 하면 항상 더 많은 작업이 필요하기 때문에 점진적 가비지 컬렉터가 감당하기 어려울 정도로 변경 사항이 너무 많아서 마킹 단계가 끝나지 않게 될 수 있습니다. 이러한 경우 가비지 컬렉터는 전체적이고 비점진적인 컬렉션을 수행하는 것으로 폴백합니다.

Unity는 점진적 가비지 컬렉션을 사용하는 경우 추가 코드(쓰기 배리어라고 함)를 생성하여 레퍼런스가 변경될 때마다 가비지 컬렉터에 알립니다. 그러면 오브젝트를 다시 스캔해야 하는지 알 수 있습니다. 이렇게 하면 관리되는 코드의 성능에 영향을 미치는 레퍼런스 변경 시 일부 부하가 추가됩니다.

점진적 가비지 컬렉션을 비활성화하려면 Player 설정 창(Edit > Project Settings > Player > Configuration)을 열고 Use Incremental GC를 비활성화합니다. 대부분의 Unity 프로젝트에는 점진적 가비지 컬렉션을 사용하는 것이 좋습니다. 특히 가비지 컬렉션 스파이크가 발생하는 경우가 많지만 항상 애플리케이션이 예상대로 작동하는지 확인하려면 프로파일러를 사용해야 합니다.

가비지 컬렉터 개요
가비지 컬렉션 비활성화