Gestione della memoria in Kotlin/Native: il nuovo MM
Esplori il nuovo gestore della memoria di Kotlin/Native, il GC e la proprietà degli oggetti.
Gestione della memoria in Kotlin/Native: il nuovo MM è una lezione Kotlin Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Kotlin Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Kotlin Academy include 4 lezioni in totale.
Il problema del vecchio memory model
Il memory model originale di Kotlin/Native (prima della versione 1.7.20) era "immutable by default": gli oggetti dovevano essere congelati prima di attraversare i confini tra thread. Questo rendeva il codice multithread complesso e incompatibile con la semantica delle coroutine Kotlin.
Il nuovo memory manager (1.7.20+)
Dalla versione 1.7.20, Kotlin/Native utilizza un nuovo memory model con garbage collection, che rispecchia il comportamento di JVM/JS. Per impostazione predefinita, è consentito modificare gli oggetti tra thread. Le API freeze() / isFrozen sono deprecate e non eseguono alcuna operazione.
Progettazione del garbage collector
Il nuovo MM utilizza un GC stop-the-world mark-and-sweep eseguito su un thread GC separato. Mira a ridurre al minimo i tempi di pausa e opera in modo incrementale. Le versioni future continueranno a perfezionare la strategia del GC.
Coroutine e nuovo MM
Con il nuovo MM, kotlinx.coroutines funziona in modo identico su Kotlin/Native e sulla JVM. È possibile condividere lo stato mutabile tra coroutine utilizzando gli stessi pattern, ad esempio un campo mutabile protetto da Mutex, senza congelarlo.
val mutex = Mutex()
var counter = 0
suspend fun increment() = mutex.withLock { counter++ }Sicurezza dei thread nel nuovo MM
Il nuovo MM non fornisce automaticamente la sicurezza dei thread: è comunque necessario sincronizzare manualmente lo stato mutabile condiviso utilizzando Mutex, AtomicInt, AtomicReference, oppure confinare lo stato a un singolo thread tramite i dispatcher delle coroutine.
Atomics in Kotlin/Native
Utilizzi kotlin.native.concurrent.AtomicInt, AtomicLong, AtomicReference per eseguire operazioni atomiche lock-free su valori primitivi e riferimenti:
val counter = AtomicInt(0)
fun increment() { counter.increment() }
fun read(): Int = counter.valueCiclo di vita degli oggetti e ARC sui target Apple
Sulle piattaforme Apple (iOS/macOS), Kotlin/Native utilizza ARC (Automatic Reference Counting) per l'interoperabilità con gli oggetti Objective-C. Gli oggetti gestiti da Kotlin sono amministrati dal GC; gli oggetti ObjC/Swift passati a Kotlin vengono collegati tramite wrapper compatibili con ARC.
Memory leak: aspetti da tenere sotto controllo
Problemi comuni di memoria in Native: cicli di riferimento tra oggetti Kotlin e delegate/closure ObjC, grafi di oggetti di grandi dimensioni che non vengono rilasciati dopo l'uso e worker in background di lunga durata che mantengono riferimenti a oggetti dell'interfaccia utente. Utilizzi Xcode Instruments per analizzare le prestazioni sui target Apple.
Thread worker in background
Utilizzi kotlin.native.concurrent.Worker per i thread in background a livello di piattaforma, oppure preferisca le coroutine con un dispatcher nativo. Ogni Worker dispone di un proprio event loop; comunichi tramite execute(), che trasferisce o condivide gli oggetti secondo le regole del nuovo MM.
Migrare dal vecchio MM
Rimuova tutte le chiamate a freeze(), ensureNeverFrozen() e isFrozen. Sostituisca le soluzioni alternative basate su AtomicReference con semplici proprietà mutabili protette da un Mutex, se necessario. Aggiorni kotlinx.coroutines alla versione 1.6.4 o successiva per il supporto al nuovo MM.
Ottimizzazione del GC
Il GC può essere ottimizzato tramite proprietà di sistema o opzioni dei binari Kotlin/Native. Per le applicazioni sensibili alla latenza, provi a modificare kotlin.native.gc.collectIntervalMillis. Per i dispositivi con memoria limitata, riduca le dimensioni dell'heap tramite kotlin.native.gc.heapTriggerCoefficient.
Verifica rapida
Quale cambiamento fondamentale ha introdotto il nuovo memory manager di Kotlin/Native (1.7.20+)?
Riepilogo: gestione della memoria in Kotlin/Native
Punti chiave:
- Nuovo MM (1.7.20+): gestito dal GC, oggetti mutabili condivisibili tra thread,
freeze()non esegue alcuna operazione - È comunque necessaria la sincronizzazione manuale:
Mutex,AtomicInt,AtomicReference - I target Apple utilizzano ARC per l'interoperabilità con ObjC; gli oggetti Kotlin sono gestiti dal GC
- Con il nuovo MM, le coroutine funzionano in modo identico alla JVM
- Rimuova le vecchie chiamate a
freeze()durante la migrazione al nuovo MM
Domande Frequenti
La lezione «Gestione della memoria in Kotlin/Native: il nuovo MM» è gratuita?
Sì — il testo completo di «Gestione della memoria in Kotlin/Native: il nuovo MM» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Kotlin Academy, passa a CoddyKit PRO. Il corso Kotlin Academy include 4 lezioni in totale.
Cosa imparerò in «Gestione della memoria in Kotlin/Native: il nuovo MM»?
Esplori il nuovo gestore della memoria di Kotlin/Native, il GC e la proprietà degli oggetti. Eserciti Kotlin Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Kotlin Academy?
Non è richiesta alcuna esperienza precedente. Kotlin Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Gestione della memoria in Kotlin/Native: il nuovo MM»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Kotlin Academy?
Sì. Ogni lezione Kotlin Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Panoramica di Kotlin/Native: target, toolchain e compilazione
- Gestione della memoria in Kotlin/Native: il nuovo MM
- Interop con C tramite cinterop e file .def
- Kotlin/WASM: compilazione in WebAssembly per il browser