Skip to content

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

NOTE

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

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

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

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

オブジェクトの容易な共有とは別に、新しいメモリマネージャーは他にも主要な変更点をもたらします。

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

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

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クラスを使用してください。

次のステップ