Speicherverwaltung in Kotlin/Native: Der neue MM
Erkunden Sie den neuen Kotlin/Native-Speicherverwalter, die Garbage Collection und den Besitz von Objekten.
Speicherverwaltung in Kotlin/Native: Der neue MM ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Das Problem des alten Speichermodells
Das ursprüngliche Speichermodell von Kotlin/Native (vor 1.7.20) war „standardmäßig unveränderlich“: Objekte mussten eingefroren werden, bevor sie Thread-Grenzen überschritten. Das machte Code für mehrere Threads umständlich und inkompatibel mit der Semantik von Kotlin-Coroutines.
Der neue Speichermanager (1.7.20+)
Seit Kotlin 1.7.20 verwendet Kotlin/Native ein neues, Garbage-Collection-basiertes Speichermodell, das dem Verhalten von JVM/JS entspricht. Die Mutation von Objekten über Threads hinweg ist standardmäßig erlaubt. Die APIs freeze() und isFrozen sind veraltet und wirkungslos.
Aufbau des Garbage Collectors
Das neue MM verwendet einen Stop-the-World-Mark-and-Sweep-GC, der auf einem separaten GC-Thread ausgeführt wird. Er soll die Pausenzeiten minimieren und arbeitet inkrementell. Künftige Versionen werden die GC-Strategie weiter verfeinern.
Coroutines und das neue MM
Mit dem neuen MM funktioniert kotlinx.coroutines unter Kotlin/Native genauso wie auf der JVM. Sie können veränderlichen Zustand zwischen Coroutines mit denselben Mustern gemeinsam nutzen (z. B. ein durch Mutex geschütztes veränderliches Feld), ohne ihn einzufrieren.
val mutex = Mutex()
var counter = 0
suspend fun increment() = mutex.withLock { counter++ }Thread-Sicherheit im neuen MM
Das neue MM bietet keine automatische Thread-Sicherheit – Sie müssen gemeinsam genutzten veränderlichen Zustand weiterhin manuell synchronisieren, indem Sie Mutex, AtomicInt oder AtomicReference verwenden oder den Zustand über Coroutine-Dispatcher auf einen einzelnen Thread beschränken.
Atomics in Kotlin/Native
Verwenden Sie kotlin.native.concurrent.AtomicInt, AtomicLong und AtomicReference für sperrenfreie atomare Operationen mit primitiven Werten und Referenzen:
val counter = AtomicInt(0)
fun increment() { counter.increment() }
fun read(): Int = counter.valueObjektlebenszyklus und ARC auf Apple-Zielen
Auf Apple-Plattformen (iOS/macOS) verwendet Kotlin/Native ARC (Automatic Reference Counting) für die Interoperabilität mit Objective-C-Objekten. Kotlin-eigene Objekte werden vom GC verwaltet; an Kotlin übergebene ObjC-/Swift-Objekte werden über ARC-kompatible Wrapper überbrückt.
Speicherlecks: Worauf Sie achten sollten
Häufige Speicherprobleme in Native sind Retain Cycles zwischen Kotlin-Objekten und ObjC-Delegates oder -Closures, große Objektgraphen, die nach der Verwendung nicht freigegeben werden, sowie langlebige Hintergrund-Worker, die Referenzen auf UI-Objekte halten. Verwenden Sie Xcode Instruments für die Profilanalyse auf Apple-Zielen.
Hintergrund-Worker-Threads
Verwenden Sie kotlin.native.concurrent.Worker für plattformnahe Hintergrund-Threads (oder bevorzugen Sie Coroutines mit einem nativen Dispatcher). Jeder Worker besitzt eine eigene Ereignisschleife. Die Kommunikation erfolgt über execute(), das Objekte entsprechend den Regeln des neuen MM überträgt oder gemeinsam nutzt.
Vom alten MM migrieren
Entfernen Sie alle Aufrufe von freeze(), ensureNeverFrozen() und isFrozen. Ersetzen Sie Workarounds mit AtomicReference bei Bedarf durch einfache veränderliche Eigenschaften, die durch ein Mutex geschützt werden. Aktualisieren Sie kotlinx.coroutines für die Unterstützung des neuen MM auf 1.6.4+.
GC-Tuning
Der GC kann über Systemeigenschaften oder Binäroptionen für Kotlin/Native angepasst werden. Experimentieren Sie bei latenzsensitiven Anwendungen mit kotlin.native.gc.collectIntervalMillis. Verringern Sie bei speicherbeschränkten Geräten die Heap-Größe über kotlin.native.gc.heapTriggerCoefficient.
Schnelltest
Welche wesentliche Änderung führte Kotlin/Native mit dem neuen Speichermanager (1.7.20+) ein?
Zusammenfassung: Speicherverwaltung in Kotlin/Native
Die wichtigsten Erkenntnisse:
- Neues MM (1.7.20+): GC-verwaltet, veränderliche Objekte können über Threads hinweg gemeinsam genutzt werden,
freeze()ist wirkungslos - Manuelle Synchronisierung ist weiterhin erforderlich:
Mutex,AtomicInt,AtomicReference - Apple-Ziele verwenden ARC für die ObjC-Interoperabilität; Kotlin-Objekte werden vom GC verwaltet
- Coroutines funktionieren im neuen MM genauso wie auf der JVM
- Entfernen Sie beim Wechsel zum neuen MM alte Aufrufe von
freeze()
Häufig gestellte Fragen
Ist die Lektion „Speicherverwaltung in Kotlin/Native: Der neue MM“ kostenlos?
Ja — der vollständige Text von „Speicherverwaltung in Kotlin/Native: Der neue MM“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Speicherverwaltung in Kotlin/Native: Der neue MM“?
Erkunden Sie den neuen Kotlin/Native-Speicherverwalter, die Garbage Collection und den Besitz von Objekten. Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Kotlin Academy zu starten?
Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Speicherverwaltung in Kotlin/Native: Der neue MM“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?
Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Kotlin/Native im Überblick: Ziele, Toolchain und Kompilierung
- Speicherverwaltung in Kotlin/Native: Der neue MM
- C-Interop mit cinterop und .def-Dateien
- Kotlin/WASM: Kompilieren für WebAssembly im Browser