Kotlin/Nativeのメモリ管理:新しいMM
Kotlin/Nativeの新しいメモリマネージャー、GC、オブジェクトの所有権について学びます。
「Kotlin/Nativeのメモリ管理:新しいMM」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
従来のメモリモデルの問題
Kotlin/Native の元のメモリモデル(1.7.20 より前)は「デフォルトで不変」でした。スレッド境界を越える前に、オブジェクトをフリーズする必要がありました。そのため、マルチスレッドコードの扱いが煩雑になり、Kotlin コルーチンのセマンティクスとも互換性がありませんでした。
新しいメモリマネージャー(1.7.20以降)
Kotlin 1.7.20 以降、Kotlin/Native は JVM/JS の動作に近い、新しいガベージコレクション方式のメモリモデルを使用します。デフォルトでスレッド間のオブジェクトの変更が許可されます。freeze()/isFrozen API は非推奨となり、何もしない操作になっています。
ガベージコレクターの設計
新しい MM は、別の GC スレッドで実行されるストップ・ザ・ワールド方式のマークアンドスイープ GC を使用します。停止時間を最小限に抑えることを目指し、段階的に動作します。今後のリリースでも GC 戦略は継続的に改善される予定です。
コルーチンと新しいMM
新しい MM では、kotlinx.coroutines は JVM 上と同じように Kotlin/Native でも動作します。フリーズすることなく、同じパターン(たとえば Mutex で保護した可変フィールド)を使って、コルーチン間で可変状態を共有できます。
val mutex = Mutex()
var counter = 0
suspend fun increment() = mutex.withLock { counter++ }新しいMMでのスレッド安全性
新しい MM がスレッド安全性を自動的に提供するわけではありません。Mutex、AtomicInt、AtomicReference を使って共有する可変状態を手動で同期するか、コルーチンディスパッチャーによって状態を単一スレッドに限定する必要があります。
Kotlin/Nativeでのアトミック操作
kotlin.native.concurrent.AtomicInt、AtomicLong、AtomicReference を使用して、プリミティブ値と参照に対するロックフリーのアトミック操作を行います:
val counter = AtomicInt(0)
fun increment() { counter.increment() }
fun read(): Int = counter.valueAppleターゲットでのオブジェクトのライフサイクルとARC
Apple プラットフォーム(iOS/macOS)では、Kotlin/Native は Objective-C オブジェクトとの相互運用に ARC(自動参照カウント)を使用します。Kotlin が所有するオブジェクトは GC によって管理され、Kotlin に渡された ObjC/Swift オブジェクトは ARC 互換のラッパーを介してブリッジされます。
メモリリーク:注意すべき点
Native でよくあるメモリ関連の問題には、Kotlin オブジェクトと ObjC のデリゲート/クロージャー間の保持サイクル、使用後も解放されない大きなオブジェクトグラフ、UI オブジェクトへの参照を保持し続ける長時間稼働のバックグラウンドワーカーがあります。Apple ターゲットでは Xcode Instruments を使ってプロファイリングしてください。
バックグラウンドワーカースレッド
プラットフォームレベルのバックグラウンドスレッドには kotlin.native.concurrent.Worker を使用してください(または Native のディスパッチャーを使うコルーチンを優先してください)。各 Worker は独自のイベントループを持ちます。execute() を介して通信し、新しい MM のルールに従ってオブジェクトを転送または共有します。
従来のMMからの移行
freeze()、ensureNeverFrozen()、isFrozen の呼び出しをすべて削除してください。必要に応じて、AtomicReference による回避策を、Mutex で保護した通常の可変プロパティに置き換えます。新しい MM をサポートするため、kotlinx.coroutines を 1.6.4 以降に更新してください。
GCの調整
GC は、システムプロパティまたは Kotlin/Native のバイナリオプションで調整できます。レイテンシーが重視されるアプリでは、kotlin.native.gc.collectIntervalMillis を試してみてください。メモリに制約のあるデバイスでは、kotlin.native.gc.heapTriggerCoefficient によってヒープサイズを小さくできます。
確認問題
Kotlin/Native の新しいメモリマネージャー(1.7.20 以降)で導入された主な変更は何ですか?
復習:Kotlin/Nativeのメモリ管理
要点:
- 新しい MM(1.7.20 以降):GC によって管理され、可変オブジェクトをスレッド間で共有できます。
freeze()は何もしません - 手動の同期は引き続き必要です:
Mutex、AtomicInt、AtomicReference - Apple ターゲットでは ObjC との相互運用に ARC を使用し、Kotlin オブジェクトは GC で管理されます
- 新しい MM では、コルーチンは JVM と同じように動作します
- 新しい MM に移行する際は、従来の
freeze()の呼び出しを削除してください
よくある質問
「Kotlin/Nativeのメモリ管理:新しいMM」レッスンは無料ですか?
はい。「Kotlin/Nativeのメモリ管理:新しいMM」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「Kotlin/Nativeのメモリ管理:新しいMM」で何を学びますか?
Kotlin/Nativeの新しいメモリマネージャー、GC、オブジェクトの所有権について学びます。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「Kotlin/Nativeのメモリ管理:新しいMM」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Kotlin/Nativeの概要:ターゲット、ツールチェーン、コンパイル
- Kotlin/Nativeのメモリ管理:新しいMM
- cinteropと.defファイルによるC相互運用
- Kotlin/WASM:ブラウザー向けWebAssemblyへのコンパイル