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