Skip to content

새 메모리 관리자로 마이그레이션

NOTE

Kotlin 1.9.20부터 레거시 메모리 관리자 지원이 완전히 제거되었습니다. Kotlin 1.7.20부터 기본적으로 활성화된 현재 메모리 모델로 프로젝트를 마이그레이션하세요.

이 가이드에서는 새로운 Kotlin/Native 메모리 관리자를 레거시 메모리 관리자와 비교하고 프로젝트를 마이그레이션하는 방법을 설명합니다.

새 메모리 관리자에서 가장 눈에 띄는 변화는 객체 공유에 대한 제약을 완화했다는 것입니다. 스레드 간에 객체를 공유하기 위해 객체를 고정(freeze)할 필요가 없습니다. 구체적으로:

  • 최상위 속성(Top-level properties)은 @SharedImmutable을 사용하지 않고도 모든 스레드에서 액세스하고 수정할 수 있습니다.
  • 상호 운용(interop)을 통해 전달되는 객체는 고정하지 않고도 모든 스레드에서 액세스하고 수정할 수 있습니다.
  • Worker.executeAfter는 더 이상 작업(operation)을 고정할 필요가 없습니다.
  • Worker.execute는 더 이상 프로듀서가 독립된 객체 서브그래프를 반환하도록 요구하지 않습니다.
  • AtomicReferenceFreezableAtomicReference를 포함하는 참조 주기(reference cycles)는 메모리 누수를 유발하지 않습니다.

손쉬운 객체 공유 외에도, 새 메모리 관리자는 다음과 같은 다른 주요 변경 사항도 가져옵니다:

  • 전역 속성(Global properties)은 정의된 파일에 처음 액세스될 때 지연 초기화됩니다. 이전에는 전역 속성이 프로그램 시작 시 초기화되었습니다. 해결 방법으로, 프로그램 시작 시 초기화되어야 하는 속성을 @EagerInitialization 애너테이션으로 표시할 수 있습니다. 사용하기 전에 해당 문서를 확인하세요.
  • by lazy {} 속성은 스레드 안전 모드를 지원하며 무한 재귀를 처리하지 않습니다.
  • Worker.executeAfteroperation에서 벗어나는 예외는 다른 런타임 부분과 마찬가지로 처리됩니다. 사용자 정의 처리되지 않은 예외 훅을 실행하거나, 훅을 찾지 못했거나 훅 자체에서 예외가 발생한 경우 프로그램을 종료함으로써 처리됩니다.
  • 고정(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 클래스를 사용하세요.

다음 단계