Skip to content

新しいメモリーマネージャーへの移行

従来のメモリーマネージャーのサポートは、Kotlin 1.9.20で完全に削除されました。プロジェクトを現在のメモリーモデル(Kotlin 1.7.20以降でデフォルトで有効)に移行してください。

このガイドでは、新しいKotlin/Nativeメモリーマネージャーと従来のマネージャーを比較し、プロジェクトを移行する方法について説明します。

新しいメモリーマネージャーで最も顕著な変更点は、オブジェクト共有に関する制限が解除されたことです。オブジェクトをスレッド間で共有するためにフリーズする必要がなくなりました。具体的には次のとおりです。

  • トップレベルプロパティは、@SharedImmutableを使用せずに、どのスレッドからもアクセスおよび変更できます。
  • 相互運用経由で渡されるオブジェクトは、フリーズせずに、どのスレッドからもアクセスおよび変更できます。
  • Worker.executeAfterは、操作がフリーズされている必要がなくなりました。
  • Worker.executeは、プロデューサーが分離されたオブジェクトサブグラフを返す必要がなくなりました。
  • AtomicReferenceおよびFreezableAtomicReferenceを含む参照サイクルは、メモリーリークを引き起こしません。

容易なオブジェクト共有以外にも、新しいメモリーマネージャーには他の主要な変更点があります。

  • グローバルプロパティは、それらが定義されているファイルに最初にアクセスされたときに遅延初期化されます。以前は、グローバルプロパティはプログラムの起動時に初期化されていました。回避策として、プログラムの起動時に初期化する必要があるプロパティには、@EagerInitializationアノテーションを付けてマークできます。使用する前に、そのドキュメントを確認してください。
  • by lazy {}プロパティは、スレッドセーフティモードをサポートし、無制限の再帰を処理しません。
  • Worker.executeAfteroperationから逸脱した例外は、他のランタイム部分と同様に処理されます。ユーザー定義の未処理例外フックを実行しようとするか、フックが見つからないか、フック自体が例外で失敗した場合はプログラムを終了します。
  • フリーズは非推奨となり、常に無効化されます。

従来のメモリーマネージャーからプロジェクトを移行するには、次のガイドラインに従ってください。

Kotlinの更新

新しいKotlin/Nativeメモリーマネージャーは、Kotlin 1.7.20以降でデフォルトで有効になっています。Kotlinのバージョンを確認し、必要に応じて最新版に更新してください

依存関係の更新

kotlinx.coroutines

バージョン1.6.0以降に更新してください。native-mtサフィックスの付いたバージョンは使用しないでください。

また、新しいメモリーマネージャーには、考慮すべきいくつかの詳細があります。

  • フリーズが不要になったため、すべての一般的なプリミティブ(チャネル、フロー、コルーチン)はWorker境界を越えて機能します。
  • Dispatchers.Defaultは、LinuxとWindowsではWorkerのプールによって、Appleターゲットではグローバルキューによって支えられています。
  • newSingleThreadContextを使用して、Workerによって支えられたコルーチンディスパッチャーを作成してください。
  • newFixedThreadPoolContextを使用して、N個のWorkerのプールによって支えられたコルーチンディスパッチャーを作成してください。
  • Dispatchers.Mainは、Darwinではメインキューによって、その他のプラットフォームではスタンドアロンWorkerによって支えられています。
Ktor
バージョン2.0以降に更新してください。
その他の依存関係

ほとんどのライブラリは変更なしで動作するはずですが、例外があるかもしれません。

依存関係を最新バージョンに更新し、従来のメモリーマネージャーと新しいメモリーマネージャーでライブラリのバージョンに違いがないことを確認してください。

コードの更新

新しいメモリーマネージャーをサポートするには、影響を受けるAPIの使用を削除してください。

古いAPI対応
@SharedImmutableすべての使用箇所を削除できます。ただし、新しいメモリーマネージャーでこのAPIを使用しても警告は表示されません。
FreezableAtomicReference クラス代わりにAtomicReferenceを使用してください。
FreezingException クラスすべての使用箇所を削除してください。
InvalidMutabilityException クラスすべての使用箇所を削除してください。
IncorrectDereferenceException クラスすべての使用箇所を削除してください。
freeze() 関数すべての使用箇所を削除してください。
isFrozen プロパティすべての使用箇所を削除できます。フリーズは非推奨であるため、このプロパティは常にfalseを返します。
ensureNeverFrozen() 関数すべての使用箇所を削除してください。
atomicLazy() 関数代わりにlazy()を使用してください。
MutableData クラス代わりに通常のコレクションを使用してください。
WorkerBoundReference<out T : Any> クラスTを直接使用してください。
DetachedObjectGraph<T> クラスTを直接使用してください。C相互運用経由で値を渡すには、StableRefクラスを使用してください。

次に行うこと