Как Kotlin/Native сборщик мусора работает в C?

Я нашел некоторое объяснение модели управления памятью 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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
0
2 981
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Управление памятью в 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.

Когда запускается сборка мусора в K/N? Вставляет ли компилятор вызовы garbageCollect, когда вы пытаетесь выделить память, или когда кадр стека извлекается, или что-то в этом роде? Или создается поток, который управляет сборкой мусора?

Kerrick Staley 09.11.2019 01:07

Привет, @KerrickStaley! Как видно из приведенного выше кода, garbageCollect() вызывается средой выполнения в некоторых операциях (обычно с проверкой условий). Кроме того, возможно, вам будет интересно видео это.

Artyom Degtyarev 12.11.2019 13:42

Спасибо! Видео, наряду с более подробным чтением файла Memory.cpp, было полезным :)

Kerrick Staley 14.11.2019 19:50

Другие вопросы по теме