新しいメモリマネージャーへの移行
注記
Kotlin 1.9.20では、従来のメモリマネージャーのサポートが完全に削除されました。プロジェクトを現在のメモリモデルに移行してください。これはKotlin 1.7.20以降、デフォルトで有効になっています。
このガイドでは、新しいKotlin/Native memory managerと従来のメモリマネージャーを比較し、プロジェクトを移行する方法について説明します。
新しいメモリマネージャーで最も顕著な変更点は、オブジェクトの共有に関する制限が解除されたことです。スレッド間でオブジェクトを共有するためにオブジェクトをfreezeする必要はありません。具体的には以下のとおりです。
- トップレベルのプロパティは、
@SharedImmutable
を使用しなくても、どのスレッドからでもアクセスおよび変更できます。 - interopを通過するオブジェクトは、freezeしなくても、どのスレッドからでもアクセスおよび変更できます。
Worker.executeAfter
は、操作をfreezeする必要がなくなりました。Worker.execute
は、プロデューサーが分離されたオブジェクトサブグラフを返す必要がなくなりました。AtomicReference
とFreezableAtomicReference
を含む参照サイクルは、メモリリークを引き起こしません。
オブジェクトの簡単な共有に加えて、新しいメモリマネージャーには、他にも大きな変更があります。
- グローバルプロパティは、それらが定義されているファイルが最初にアクセスされたときに遅延初期化されます。以前は、グローバルプロパティはプログラムの起動時に初期化されていました。回避策として、プログラムの起動時に初期化する必要があるプロパティに
@EagerInitialization
アノテーションを付けることができます。使用する前に、そのドキュメントを確認してください。 by lazy {}
プロパティは、スレッドセーフモードをサポートし、unbounded recursionを処理しません。Worker.executeAfter
のoperation
からエスケープする例外は、他のランタイム部分と同様に処理されます。つまり、ユーザー定義の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
サフィックスが付いたバージョンは使用しないでください。
新しいメモリマネージャーには、注意すべきいくつかの特殊な点もあります。
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 API | What 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> class | T を直接使用してください。 |
The DetachedObjectGraph<T> class | T を直接使用してください。C interopを介して値を渡すには、the StableRef classを使用してください。 |