Я нашел некоторое объяснение модели управления памятью Kotlin/Native в Часто задаваемые вопросы о JetBrains.
A: Kotlin/Native provides an automated memory management scheme, similar to what Java or Swift provides. The current implementation includes an automated reference counter with a cycle collector to collect cyclical garbage.
Я более или менее понимаю, как это работает в Java или Kotlin (JVM). Может ли кто-нибудь подробно описать, как память управляется в Kotlin/Native в проектах с C?
Кроме того, если есть сборщик мусора, зачем нам функция Kotlin/Native memScoped { }?
Также я нашел здесь :
Kotlin/Native is a technology for compiling Kotlin to native binaries that run without any VM. Broadly speaking, Native code is any code whose memory is not managed by the underlying framework but has to be managed by the programmer themselves. i.e. there is no Garbage collection. e.g. C++’ delete and C’s free
что на мой взгляд противоречит тому что написано в FAQ JetBrains
Управление памятью в K/N обеспечивается средой выполнения. Он состоит из двух основных частей: автоматического подсчета ссылок и сборщика циклов. Это дает возможность писать код так же, как в Kotlin/JVM. Некоторые подробности по этой теме можно найти в этом файл, но все, что вам нужно знать, это то, что по умолчанию это происходит автоматически.
О MemScoped и т. д. Когда вы используете интероперабельность с C, вам приходится иметь дело с управлением таким ресурсом, как родная память. Собственная память — это память, предоставляемая процессу приложения операционной системой. Поскольку это не имеет ничего общего с кодом Kotlin, этот ресурс не может управляться средой выполнения K/N. Но все C struct
и переменные, которые вы собираетесь использовать, должны быть размещены там. Вы можете сделать это напрямую, вызвав функцию nativeHeap.alloc()
. Когда потребность в этой памяти отпадет, ее можно освободить с помощью nativeHeap.free()
.
Но чтобы сделать вашу работу более удобной, K/N также имеет класс Arena
, реализующий управление памятью на основе регионов. Это упрощает управление памятью до серии alloc()
там, где вам нужно, и одного освобождения .clear()
для всего региона.
Также есть блоки MemScoped{}, которые закрывают от вас Арену и позволяют забыть даже об освобождении родной памяти. Таким образом, в вашем коде, который включает некоторые элементы из C, вы можете просто написать MemScoped { ... }
, а затем добавить в него операции. Вы можете увидеть множество примеров этого подхода в образцы из репозитория K/N.
Привет, @KerrickStaley! Как видно из приведенного выше кода, garbageCollect()
вызывается средой выполнения в некоторых операциях (обычно с проверкой условий). Кроме того, возможно, вам будет интересно видео это.
Спасибо! Видео, наряду с более подробным чтением файла Memory.cpp, было полезным :)
Когда запускается сборка мусора в K/N? Вставляет ли компилятор вызовы
garbageCollect
, когда вы пытаетесь выделить память, или когда кадр стека извлекается, или что-то в этом роде? Или создается поток, который управляет сборкой мусора?