0Pricing
Kotlin Academy · Lekcja

Zarządzanie pamięcią w Kotlin/Native: nowy menedżer pamięci

Poznaj nowy menedżer pamięci Kotlin/Native, GC i własność obiektów.

Zarządzanie pamięcią w Kotlin/Native: nowy menedżer pamięci to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Problem starego modelu pamięci

Pierwotny model pamięci Kotlin/Native (sprzed wersji 1.7.20) był „domyślnie niezmienny”: obiekty trzeba było zamrażać przed przekroczeniem granic wątków. Utrudniało to tworzenie kodu wielowątkowego i było niezgodne z semantyką korutyn Kotlinu.

Nowy menedżer pamięci (1.7.20+)

Od wersji Kotlin 1.7.20 Kotlin/Native używa nowego modelu pamięci z odśmiecaniem pamięci, który odzwierciedla zachowanie JVM/JS. Domyślnie mutowanie obiektów między wątkami jest dozwolone. Interfejsy API freeze() / isFrozen są przestarzałe i nic nie robią.

Projekt kolektora pamięci

Nowy menedżer pamięci używa kolektora GC typu stop-the-world mark-and-sweep, który działa w osobnym wątku GC. Jego celem jest minimalizowanie czasu wstrzymań, a działanie odbywa się przyrostowo. W kolejnych wersjach strategia GC będzie nadal udoskonalana.

Korutyny i nowy menedżer pamięci

Wraz z nowym menedżerem pamięci kotlinx.coroutines działa w Kotlin/Native tak samo jak na JVM. Można współdzielić zmienny stan między korutynami, używając tych samych wzorców (np. pola mutowalnego chronionego przez Mutex), bez zamrażania obiektów.

val mutex = Mutex()
var counter = 0

suspend fun increment() = mutex.withLock { counter++ }

Bezpieczeństwo wątkowe w nowym menedżerze pamięci

Nowy menedżer pamięci nie zapewnia automatycznego bezpieczeństwa wątkowego — nadal trzeba ręcznie synchronizować współdzielony zmienny stan za pomocą Mutex, AtomicInt, AtomicReference albo ograniczyć stan do jednego wątku za pomocą dyspozytorów korutyn.

Typy atomowe w Kotlin/Native

Używaj kotlin.native.concurrent.AtomicInt, AtomicLong i AtomicReference do bezblokadowych operacji atomowych na wartościach prostych i referencjach:

val counter = AtomicInt(0)
fun increment() { counter.increment() }
fun read(): Int = counter.value

Cykl życia obiektów i ARC na platformach Apple

Na platformach Apple (iOS/macOS) Kotlin/Native używa ARC (automatycznego zliczania referencji) do współdziałania z obiektami Objective-C. Obiekty zarządzane przez Kotlin są obsługiwane przez GC, a obiekty ObjC/Swift przekazywane do Kotlinu są opakowywane w sposób zgodny z ARC.

Wycieki pamięci: na co uważać

Typowe problemy z pamięcią w Native to cykle referencji między obiektami Kotlinu a delegatami/closure ObjC, duże grafy obiektów, które nie są zwalniane po użyciu, oraz długotrwałe wątki robocze przechowujące referencje do obiektów interfejsu użytkownika. Do profilowania na platformach Apple używaj Xcode Instruments.

Wątki robocze w tle

Używaj kotlin.native.concurrent.Worker dla niskopoziomowych wątków działających w tle (lub preferuj korutyny z natywnym dyspozytorem). Każdy Worker ma własną pętlę zdarzeń; komunikuj się za pomocą execute(), które przenosi lub współdzieli obiekty zgodnie z zasadami nowego menedżera pamięci.

Migracja ze starego modelu pamięci

Usuń wszystkie wywołania freeze(), ensureNeverFrozen() i isFrozen. Zastąp obejścia z użyciem AtomicReference zwykłymi właściwościami mutowalnymi chronionymi przez Mutex, jeśli jest to potrzebne. Zaktualizuj kotlinx.coroutines do wersji 1.6.4 lub nowszej, aby zapewnić obsługę nowego modelu pamięci.

Dostrajanie GC

GC można dostrajać za pomocą właściwości systemowych lub opcji pliku binarnego Kotlin/Native. W aplikacjach wrażliwych na opóźnienia warto eksperymentować z kotlin.native.gc.collectIntervalMillis. W przypadku urządzeń z ograniczoną pamięcią można zmniejszyć rozmiar sterty za pomocą kotlin.native.gc.heapTriggerCoefficient.

Szybkie sprawdzenie

Jaką kluczową zmianę wprowadził nowy menedżer pamięci Kotlin/Native (1.7.20+)?

Podsumowanie: zarządzanie pamięcią w Kotlin/Native

Najważniejsze informacje:

  • Nowy menedżer pamięci (1.7.20+): pamięć zarządzana przez GC, obiekty mutowalne można współdzielić między wątkami, a freeze() nic nie robi
  • Nadal potrzebna jest ręczna synchronizacja: Mutex, AtomicInt, AtomicReference
  • Platformy Apple używają ARC do współdziałania z ObjC; obiektami Kotlinu zarządza GC
  • W nowym modelu pamięci korutyny działają tak samo jak na JVM
  • Podczas migracji do nowego modelu pamięci usuń stare wywołania freeze()

Często zadawane pytania

Czy lekcja „Zarządzanie pamięcią w Kotlin/Native: nowy menedżer pamięci” jest bezpłatna?

Tak — pełny tekst „Zarządzanie pamięcią w Kotlin/Native: nowy menedżer pamięci” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Zarządzanie pamięcią w Kotlin/Native: nowy menedżer pamięci”?

Poznaj nowy menedżer pamięci Kotlin/Native, GC i własność obiektów. Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?

Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Zarządzanie pamięcią w Kotlin/Native: nowy menedżer pamięci”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?

Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Kotlin/Native — omówienie: cele, toolchain i kompilacja
  2. Zarządzanie pamięcią w Kotlin/Native: nowy menedżer pamięci
  3. Interoperacyjność z C za pomocą cinterop i plików .def
  4. Kotlin/WASM: kompilowanie do WebAssembly dla przeglądarki
← Powrót do Kotlin Academy