Gestión de memoria en Kotlin/Native: el nuevo MM
Explore el nuevo gestor de memoria de Kotlin/Native, el GC y la propiedad de los objetos
Gestión de memoria en Kotlin/Native: el nuevo MM es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.
El problema del modelo de memoria antiguo
El modelo de memoria original de Kotlin/Native (anterior a la versión 1.7.20) era «inmutable de forma predeterminada»: los objetos debían congelarse antes de atravesar los límites entre hilos. Esto hacía que el código multihilo fuera complejo y no compatible con la semántica de las corrutinas de Kotlin.
El nuevo gestor de memoria (1.7.20+)
Desde Kotlin 1.7.20, Kotlin/Native utiliza un modelo de memoria con recolección de basura que refleja el comportamiento de JVM/JS. De forma predeterminada, se permite mutar objetos entre hilos. Las API freeze() / isFrozen están obsoletas y no hacen nada.
Diseño del recolector de basura
El nuevo MM utiliza un recolector de basura de marcado y barrido con detención del mundo que se ejecuta en un hilo independiente del GC. Su objetivo es minimizar los tiempos de pausa y funcionar de forma incremental. Las versiones futuras seguirán perfeccionando la estrategia del GC.
Corrutinas y el nuevo MM
Con el nuevo MM, kotlinx.coroutines funciona en Kotlin/Native igual que en la JVM. Puede compartir estado mutable entre corrutinas utilizando los mismos patrones (por ejemplo, un campo mutable protegido por Mutex) sin congelarlo.
val mutex = Mutex()
var counter = 0
suspend fun increment() = mutex.withLock { counter++ }Seguridad de hilos en el nuevo MM
El nuevo MM no proporciona seguridad de hilos automática: aún debe sincronizar manualmente el estado mutable compartido mediante Mutex, AtomicInt o AtomicReference, o confinar el estado a un solo hilo mediante los dispatchers de corrutinas.
Atómicos en Kotlin/Native
Use kotlin.native.concurrent.AtomicInt, AtomicLong y AtomicReference para realizar operaciones atómicas sin bloqueos sobre valores primitivos y referencias:
val counter = AtomicInt(0)
fun increment() { counter.increment() }
fun read(): Int = counter.valueCiclo de vida de los objetos y ARC en destinos de Apple
En las plataformas de Apple (iOS/macOS), Kotlin/Native utiliza ARC (Automatic Reference Counting) para interoperar con objetos de Objective-C. Los objetos gestionados por Kotlin son administrados por el GC; los objetos de ObjC/Swift que se pasan a Kotlin se enlazan mediante wrappers compatibles con ARC.
Fugas de memoria: aspectos que debe vigilar
Problemas habituales de memoria en Native: ciclos de retención entre objetos de Kotlin y delegates/closures de ObjC, grafos de objetos grandes que no se liberan después de usarlos y workers en segundo plano de larga duración que mantienen referencias a objetos de la interfaz de usuario. Use Xcode Instruments para crear perfiles en destinos de Apple.
Hilos de trabajo en segundo plano
Use kotlin.native.concurrent.Worker para los hilos en segundo plano a nivel de plataforma (o prefiera corrutinas con un dispatcher nativo). Cada Worker tiene su propio bucle de eventos; comuníquese mediante execute(), que transfiere o comparte objetos según las reglas del nuevo MM.
Migrar desde el MM antiguo
Elimine todas las llamadas a freeze(), ensureNeverFrozen() e isFrozen. Sustituya las soluciones alternativas con AtomicReference por propiedades mutables normales protegidas por un Mutex cuando sea necesario. Actualice kotlinx.coroutines a la versión 1.6.4 o posterior para admitir el nuevo MM.
Ajuste del GC
El GC se puede ajustar mediante propiedades del sistema u opciones del binario de Kotlin/Native. En aplicaciones sensibles a la latencia, experimente con kotlin.native.gc.collectIntervalMillis. En dispositivos con memoria limitada, reduzca el tamaño del heap mediante kotlin.native.gc.heapTriggerCoefficient.
Comprobación rápida
¿Qué cambio fundamental introdujo el nuevo gestor de memoria de Kotlin/Native (1.7.20+)?
Repaso: gestión de memoria en Kotlin/Native
Puntos clave:
- Nuevo MM (1.7.20+): gestionado por el GC, permite compartir objetos mutables entre hilos y
freeze()no hace nada - Aun así, se necesita sincronización manual:
Mutex,AtomicIntyAtomicReference - Los destinos de Apple utilizan ARC para la interoperabilidad con ObjC; los objetos de Kotlin son gestionados por el GC
- Las corrutinas funcionan igual que en la JVM con el nuevo MM
- Elimine las llamadas antiguas a
freeze()al migrar al nuevo MM
Preguntas frecuentes
¿La lección «Gestión de memoria en Kotlin/Native: el nuevo MM» es gratis?
Sí — el texto completo de «Gestión de memoria en Kotlin/Native: el nuevo MM» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Gestión de memoria en Kotlin/Native: el nuevo MM»?
Explore el nuevo gestor de memoria de Kotlin/Native, el GC y la propiedad de los objetos Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Kotlin Academy?
No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Gestión de memoria en Kotlin/Native: el nuevo MM»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?
Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Introducción a Kotlin/Native: destinos, cadena de herramientas y compilación
- Gestión de memoria en Kotlin/Native: el nuevo MM
- Interoperabilidad con C mediante cinterop y archivos .def
- Kotlin/WASM: compilación a WebAssembly para el navegador