새 메모리 관리자로 마이그레이션
NOTE
Kotlin 1.9.20부터 레거시 메모리 관리자 지원이 완전히 제거되었습니다. Kotlin 1.7.20부터 기본적으로 활성화된 현재 메모리 모델로 프로젝트를 마이그레이션하세요.
이 가이드에서는 새로운 Kotlin/Native 메모리 관리자를 레거시 메모리 관리자와 비교하고 프로젝트를 마이그레이션하는 방법을 설명합니다.
새 메모리 관리자에서 가장 눈에 띄는 변화는 객체 공유에 대한 제약을 완화했다는 것입니다. 스레드 간에 객체를 공유하기 위해 객체를 고정(freeze)할 필요가 없습니다. 구체적으로:
- 최상위 속성(Top-level properties)은
@SharedImmutable
을 사용하지 않고도 모든 스레드에서 액세스하고 수정할 수 있습니다. - 상호 운용(interop)을 통해 전달되는 객체는 고정하지 않고도 모든 스레드에서 액세스하고 수정할 수 있습니다.
Worker.executeAfter
는 더 이상 작업(operation)을 고정할 필요가 없습니다.Worker.execute
는 더 이상 프로듀서가 독립된 객체 서브그래프를 반환하도록 요구하지 않습니다.AtomicReference
와FreezableAtomicReference
를 포함하는 참조 주기(reference cycles)는 메모리 누수를 유발하지 않습니다.
손쉬운 객체 공유 외에도, 새 메모리 관리자는 다음과 같은 다른 주요 변경 사항도 가져옵니다:
- 전역 속성(Global properties)은 정의된 파일에 처음 액세스될 때 지연 초기화됩니다. 이전에는 전역 속성이 프로그램 시작 시 초기화되었습니다. 해결 방법으로, 프로그램 시작 시 초기화되어야 하는 속성을
@EagerInitialization
애너테이션으로 표시할 수 있습니다. 사용하기 전에 해당 문서를 확인하세요. by lazy {}
속성은 스레드 안전 모드를 지원하며 무한 재귀를 처리하지 않습니다.Worker.executeAfter
의operation
에서 벗어나는 예외는 다른 런타임 부분과 마찬가지로 처리됩니다. 사용자 정의 처리되지 않은 예외 훅을 실행하거나, 훅을 찾지 못했거나 훅 자체에서 예외가 발생한 경우 프로그램을 종료함으로써 처리됩니다.- 고정(freezing)은 사용되지 않으며 항상 비활성화됩니다.
레거시 메모리 관리자에서 프로젝트를 마이그레이션하려면 다음 지침을 따르세요:
Kotlin 업데이트
새로운 Kotlin/Native 메모리 관리자는 Kotlin 1.7.20부터 기본적으로 활성화되었습니다. Kotlin 버전을 확인하고 필요한 경우 최신 버전으로 업데이트하세요.
종속성 업데이트
코드 업데이트
새 메모리 관리자를 지원하려면 영향을 받는 API 사용을 제거하세요:
이전 API | 수행할 작업 |
---|---|
@SharedImmutable | 모든 사용을 제거할 수 있습니다. 단, 새 메모리 관리자에서 이 API를 사용해도 경고는 발생하지 않습니다. |
FreezableAtomicReference 클래스 | 대신 AtomicReference 를 사용하세요. |
FreezingException 클래스 | 모든 사용을 제거하세요. |
InvalidMutabilityException 클래스 | 모든 사용을 제거하세요. |
IncorrectDereferenceException 클래스 | 모든 사용을 제거하세요. |
freeze() 함수 | 모든 사용을 제거하세요. |
isFrozen 속성 | 모든 사용을 제거할 수 있습니다. 고정(freezing)이 사용되지 않으므로, 이 속성은 항상 false 를 반환합니다. |
ensureNeverFrozen() 함수 | 모든 사용을 제거하세요. |
atomicLazy() 함수 | 대신 lazy() 를 사용하세요. |
MutableData 클래스 | 대신 일반적인 컬렉션을 사용하세요. |
WorkerBoundReference<out T : Any> 클래스 | T 를 직접 사용하세요. |
DetachedObjectGraph<T> 클래스 | T 를 직접 사용하세요. C 상호 운용(interop)을 통해 값을 전달하려면 StableRef 클래스를 사용하세요. |