新しいメモリーマネージャーへの移行
従来のメモリーマネージャーのサポートは、Kotlin 1.9.20で完全に削除されました。プロジェクトを現在のメモリーモデル(Kotlin 1.7.20以降でデフォルトで有効)に移行してください。
このガイドでは、新しいKotlin/Nativeメモリーマネージャーと従来のマネージャーを比較し、プロジェクトを移行する方法について説明します。
新しいメモリーマネージャーで最も顕著な変更点は、オブジェクト共有に関する制限が解除されたことです。オブジェクトをスレッド間で共有するためにフリーズする必要がなくなりました。具体的には次のとおりです。
- トップレベルプロパティは、
@SharedImmutable
を使用せずに、どのスレッドからもアクセスおよび変更できます。 - 相互運用経由で渡されるオブジェクトは、フリーズせずに、どのスレッドからもアクセスおよび変更できます。
Worker.executeAfter
は、操作がフリーズされている必要がなくなりました。Worker.execute
は、プロデューサーが分離されたオブジェクトサブグラフを返す必要がなくなりました。AtomicReference
およびFreezableAtomicReference
を含む参照サイクルは、メモリーリークを引き起こしません。
容易なオブジェクト共有以外にも、新しいメモリーマネージャーには他の主要な変更点があります。
- グローバルプロパティは、それらが定義されているファイルに最初にアクセスされたときに遅延初期化されます。以前は、グローバルプロパティはプログラムの起動時に初期化されていました。回避策として、プログラムの起動時に初期化する必要があるプロパティには、
@EagerInitialization
アノテーションを付けてマークできます。使用する前に、そのドキュメントを確認してください。 by lazy {}
プロパティは、スレッドセーフティモードをサポートし、無制限の再帰を処理しません。Worker.executeAfter
のoperation
から逸脱した例外は、他のランタイム部分と同様に処理されます。ユーザー定義の未処理例外フックを実行しようとするか、フックが見つからないか、フック自体が例外で失敗した場合はプログラムを終了します。- フリーズは非推奨となり、常に無効化されます。
従来のメモリーマネージャーからプロジェクトを移行するには、次のガイドラインに従ってください。
Kotlinの更新
新しいKotlin/Nativeメモリーマネージャーは、Kotlin 1.7.20以降でデフォルトで有効になっています。Kotlinのバージョンを確認し、必要に応じて最新版に更新してください。
依存関係の更新
バージョン1.6.0以降に更新してください。native-mt
サフィックスの付いたバージョンは使用しないでください。
また、新しいメモリーマネージャーには、考慮すべきいくつかの詳細があります。
- フリーズが不要になったため、すべての一般的なプリミティブ(チャネル、フロー、コルーチン)はWorker境界を越えて機能します。
Dispatchers.Default
は、LinuxとWindowsではWorkerのプールによって、Appleターゲットではグローバルキューによって支えられています。newSingleThreadContext
を使用して、Workerによって支えられたコルーチンディスパッチャーを作成してください。newFixedThreadPoolContext
を使用して、N
個のWorkerのプールによって支えられたコルーチンディスパッチャーを作成してください。Dispatchers.Main
は、Darwinではメインキューによって、その他のプラットフォームではスタンドアロンWorkerによって支えられています。
ほとんどのライブラリは変更なしで動作するはずですが、例外があるかもしれません。
依存関係を最新バージョンに更新し、従来のメモリーマネージャーと新しいメモリーマネージャーでライブラリのバージョンに違いがないことを確認してください。
コードの更新
新しいメモリーマネージャーをサポートするには、影響を受ける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クラスを使用してください。 |