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

Posted

技术标签:

【中文标题】Kotlin/Native 垃圾收集器如何在 C 中工作?【英文标题】:How Kotlin/Native garbage collector works in C? 【发布时间】:2019-08-31 18:55:54 【问题描述】:

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

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

我或多或少了解它在 Java 或 Kotlin (JVM) 中的工作原理。任何人都可以详细描述在使用 C 的项目中如何在 Kotlin/Native 中管理内存吗?

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

另外,我找到了here:

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

我认为这与 JetBrains 常见问题解答中的内容相矛盾

【问题讨论】:

【参考方案1】:

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


关于 MemScoped 等。当您使用与 C 的互操作性时,您必须处理管理诸如 本机内存之类的资源。本机内存是操作系统提供给应用程序进程的内存。由于它与 Kotlin 代码无关,因此该资源无法由 K/N 运行时管理。但是您将要使用的所有 C struct 和变量都必须在那里分配。您可以通过调用nativeHeap.alloc() 函数直接完成。当这个内存的需求消失时,可以通过nativeHeap.free() 释放它。 但是为了让你的体验更舒服,K/N 还有Arena 类,实现基于区域的内存管理。它将内存管理简化为只需在您需要的地方使用一系列alloc(),并通过.clear() 对所有区域进行一次释放。 此外,还有一个 MemScoped 块,可以覆盖 Arena,甚至可以让您忘记释放本机内存。因此,在包含 C 中的一些元素的代码中,您只需编写 MemScoped ... ,然后将操作放入其中。您可以在来自 K/N 存储库的 samples 中看到很多这种方法的示例

【讨论】:

K/N什么时候触发垃圾回收?当您尝试分配内存或弹出堆栈帧或类似情况时,编译器是否会插入对garbageCollect 的调用?还是创建了一个管理垃圾回收的线程? 嗨@KerrickStaley!正如在上面的代码中所看到的,garbageCollect() 在某些操作中被运行时调用(通常是条件检查)。另外,也许this 视频会很有趣。 谢谢!该视频以及对 Memory.cpp 文件的仔细阅读很有帮助:)

以上是关于Kotlin/Native 垃圾收集器如何在 C 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

csharp 在C#中调用垃圾收集器

如何在 kotlin native 中使用 swift 库?

JVM优化 垃圾回收 算法 垃圾收集器 GC日志可视化查看

JVM垃圾回收机制

JVM垃圾回收机制

垃圾收集器与内存分配策略