Gestion de la mémoire dans Kotlin/Native : le nouveau MM
Découvrez le nouveau gestionnaire de mémoire de Kotlin/Native, le GC et la propriété des objets.
Gestion de la mémoire dans Kotlin/Native : le nouveau MM est une leçon Kotlin Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Kotlin Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Kotlin Academy comprend 4 leçons au total.
Le problème de l’ancien modèle mémoire
Le modèle mémoire d’origine de Kotlin/Native (avant la version 1.7.20) était « immutable par défaut » : les objets devaient être gelés avant de franchir les limites entre fils d’exécution. Cela rendait le code multithread laborieux et incompatible avec la sémantique des coroutines Kotlin.
Le nouveau gestionnaire de mémoire (1.7.20 et versions ultérieures)
Depuis Kotlin 1.7.20, Kotlin/Native utilise un modèle mémoire avec récupération automatique qui reproduit le comportement de la JVM et de JS. La mutation des objets entre fils d’exécution est autorisée par défaut. Les API freeze() / isFrozen sont obsolètes et ne font rien.
Conception du récupérateur de mémoire
Le nouveau MM utilise un récupérateur de mémoire par marquage et balayage avec arrêt du monde, exécuté sur un fil d’exécution distinct. Il vise à réduire au minimum les temps de pause et fonctionne de manière incrémentielle. Les prochaines versions continueront d’affiner la stratégie de récupération.
Coroutines et nouveau MM
Avec le nouveau MM, kotlinx.coroutines fonctionne de la même manière sur Kotlin/Native que sur la JVM. Vous pouvez partager un état mutable entre des coroutines en utilisant les mêmes modèles (par exemple, une propriété mutable protégée par Mutex) sans la geler.
val mutex = Mutex()
var counter = 0
suspend fun increment() = mutex.withLock { counter++ }Sécurité des fils d’exécution avec le nouveau MM
Le nouveau MM n’assure pas automatiquement la sécurité des fils d’exécution : vous devez toujours synchroniser manuellement l’état mutable partagé avec Mutex, AtomicInt, AtomicReference, ou limiter l’état à un seul fil d’exécution au moyen de répartiteurs de coroutines.
Opérations atomiques dans Kotlin/Native
Utilisez kotlin.native.concurrent.AtomicInt, AtomicLong et AtomicReference pour effectuer des opérations atomiques sans verrou sur les valeurs primitives et les références :
val counter = AtomicInt(0)
fun increment() { counter.increment() }
fun read(): Int = counter.valueCycle de vie des objets et ARC sur les cibles Apple
Sur les plateformes Apple (iOS/macOS), Kotlin/Native utilise ARC (comptage automatique des références) pour assurer l’interopérabilité avec les objets Objective-C. Les objets gérés par Kotlin sont pris en charge par le récupérateur de mémoire ; les objets ObjC/Swift transmis à Kotlin sont reliés par des enveloppes compatibles avec ARC.
Fuites mémoire : points à surveiller
Problèmes courants de mémoire dans Native : cycles de rétention entre les objets Kotlin et les délégués ou fermetures ObjC, grands graphes d’objets qui ne sont pas libérés après utilisation et tâches d’arrière-plan de longue durée qui conservent des références vers des objets d’interface utilisateur. Utilisez Xcode Instruments pour effectuer le profilage sur les cibles Apple.
Fils d’exécution en arrière-plan
Utilisez kotlin.native.concurrent.Worker pour les fils d’exécution d’arrière-plan au niveau de la plateforme (ou préférez les coroutines avec un répartiteur natif). Chaque Worker possède sa propre boucle d’événements ; communiquez au moyen de execute(), qui transfère ou partage les objets conformément aux règles du nouveau MM.
Migrer depuis l’ancien MM
Supprimez tous les appels à freeze(), ensureNeverFrozen() et isFrozen. Remplacez les solutions de contournement utilisant AtomicReference par de simples propriétés mutables protégées par un Mutex si nécessaire. Mettez à jour kotlinx.coroutines vers la version 1.6.4 ou une version ultérieure pour prendre en charge le nouveau MM.
Réglage du récupérateur de mémoire
Le récupérateur de mémoire peut être réglé au moyen de propriétés système ou d’options de binaire Kotlin/Native. Pour les applications sensibles à la latence, essayez différents réglages de kotlin.native.gc.collectIntervalMillis. Pour les appareils disposant de peu de mémoire, réduisez la taille du tas avec kotlin.native.gc.heapTriggerCoefficient.
Vérification rapide
Quel changement essentiel le nouveau gestionnaire de mémoire de Kotlin/Native (1.7.20 et versions ultérieures) a-t-il introduit ?
Récapitulatif : gestion de la mémoire dans Kotlin/Native
Points clés :
- Nouveau MM (1.7.20 et versions ultérieures) : objets gérés par le récupérateur de mémoire et partageables entre les fils d’exécution,
freeze()ne fait rien - La synchronisation manuelle reste nécessaire :
Mutex,AtomicInt,AtomicReference - Les cibles Apple utilisent ARC pour l’interopérabilité ObjC ; les objets Kotlin sont gérés par le récupérateur de mémoire
- Les coroutines fonctionnent comme sur la JVM avec le nouveau MM
- Supprimez les anciens appels à
freeze()lors de la migration vers le nouveau MM
Questions Fréquemment Posées
La leçon « Gestion de la mémoire dans Kotlin/Native : le nouveau MM » est-elle gratuite ?
Oui — le texte complet de « Gestion de la mémoire dans Kotlin/Native : le nouveau MM » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Kotlin Academy, passe à CoddyKit PRO. Le cours Kotlin Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Gestion de la mémoire dans Kotlin/Native : le nouveau MM » ?
Découvrez le nouveau gestionnaire de mémoire de Kotlin/Native, le GC et la propriété des objets. Tu pratiques Kotlin Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Kotlin Academy ?
Aucune expérience préalable n'est requise. Kotlin Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Gestion de la mémoire dans Kotlin/Native : le nouveau MM » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Kotlin Academy ?
Oui. Chaque leçon Kotlin Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Présentation de Kotlin/Native : cibles, chaîne d’outils et compilation
- Gestion de la mémoire dans Kotlin/Native : le nouveau MM
- Interopérabilité avec C grâce à cinterop et aux fichiers .def
- Kotlin/WASM : compiler vers WebAssembly pour le navigateur