Kotlin/Native 垃圾收集器在 C 语言中是如何工作的?



我在 JetBrains FAQ 中找到了一些关于 Kotlin/Native 内存管理模型的解释。

答:Kotlin/Native 提供了一个自动化的内存管理方案, 类似于 Java 或 Swift 提供的功能。当前实现 包括一个带循环收集器的自动参考计数器,用于 收集周期性垃圾。

我或多或少了解它在Java或Kotlin(JVM)中的工作方式。谁能详细描述如何在 Kotlin/Native 中使用 C 的项目管理内存?

另外,如果有垃圾收集器,为什么我们需要一个 Kotlin/Native 函数 memScoped { }?

另外,我在这里找到:

Kotlin/Native 是一种将 Kotlin 编译为无需任何 VM 即可运行的本机二进制文件的技术。 从广义上讲,本机代码是其内存不由底层框架管理,而必须由程序员自己管理的任何代码。即没有垃圾回收。 例如C++'删除和C'自由

在我看来,这与 JetBrains 常见问题解答中所写的内容相矛盾

K/N 中的内存管理由运行时提供。它由两个主要部分组成:自动参考计数和循环收集器。这为编写代码提供了可用性,就像在 Kotlin/JVM 中一样。有关此主题的一些详细信息可以在此文件中找到,但您需要知道的是默认情况下它是自动的。


关于忆术等当您使用与 C 的互操作性时,您必须处理管理本机内存这样的资源。本机内存是操作系统提供给应用程序进程的内存。由于它与 Kotlin 代码无关,因此此资源不能由 K/N 运行时管理。但是所有 Cstruct和您将要使用的变量都必须在那里分配。您可以通过调用nativeHeap.alloc()函数直接执行此操作。当这个内存的需求消失时,可以通过nativeHeap.free()释放它。 但为了让您的体验更舒适,K/N 还Arena类,实现了基于区域的内存管理。它将内存管理简化为只需在您需要的任何位置执行一系列alloc(),并按.clear()对所有区域进行一次释放。 此外,还有一个MemScoped {}块,它涵盖了你的竞技场,甚至可以忘记释放本机内存。因此,在包含 C 中的一些元素的代码中,您可以只编写MemScoped { ... },然后将操作放入其中。您可以在 K/N 存储库的示例中看到此方法的大量示例

最新更新