メインコンテンツまでスキップ

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

注記

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

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

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

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

オブジェクトの簡単な共有に加えて、新しいメモリマネージャーには、他にも大きな変更があります。

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

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

Update Kotlin

新しいKotlin/Native memory managerは、Kotlin 1.7.20以降、デフォルトで有効になっています。Kotlinのバージョンを確認し、必要に応じて最新バージョンにアップデートしてください。

Update dependencies

kotlinx.coroutines

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

新しいメモリマネージャーには、注意すべきいくつかの特殊な点もあります。

  • freezingが不要になったため、すべての共通プリミティブ(channels、flows、coroutines)はWorkerの境界を越えて動作します。
  • Dispatchers.Defaultは、LinuxおよびWindowsではWorkerのプールによって、Appleターゲットではグローバルキューによってバックアップされています。
  • newSingleThreadContextを使用して、Workerによってバックアップされるコルーチンディスパッチャーを作成します。
  • newFixedThreadPoolContextを使用して、N個のWorkerのプールによってバックアップされるコルーチンディスパッチャーを作成します。
  • Dispatchers.Mainは、Darwinではメインキューによって、他のプラットフォームではスタンドアロンのWorkerによってバックアップされています。
  • Ktor

    バージョン2.0以降にアップデートしてください。

    Other dependencies

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

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

    Update your code

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

    Old APIWhat to do
    @SharedImmutableすべての使用を削除できます。ただし、新しいメモリマネージャーでこのAPIを使用しても警告は表示されません。
    The FreezableAtomicReference class代わりにAtomicReferenceを使用してください。
    The FreezingException classすべての使用を削除してください。
    The InvalidMutabilityException classすべての使用を削除してください。
    The IncorrectDereferenceException classすべての使用を削除してください。
    The freeze() functionすべての使用を削除してください。
    The isFrozen propertyすべての使用を削除できます。freezingは非推奨であるため、プロパティは常にfalseを返します。
    The ensureNeverFrozen() functionすべての使用を削除してください。
    The atomicLazy() function代わりにlazy()を使用してください。
    The MutableData class代わりに、通常のコレクションを使用してください。
    The WorkerBoundReference<out T : Any> classTを直接使用してください。
    The DetachedObjectGraph<T> classTを直接使用してください。C interopを介して値を渡すには、the StableRef classを使用してください。

    What's next