所以基本上我只知道GC的一些基本概念:(
我是函数式编程语言的新手,当我研究Haskell的运行时系统RTS时,我发现RTS支持来自Haskell的已编译二进制文件的GC。
所以我对这部分感到困惑,是否有一个由RTS创建的单独进程可以对Haskell二进制文件执行GC操作?
还有什么,如果有的话,是否有C / C ++的GC实现? (假设程序员只使用"智能指针"使用内存,他们不需要关心内存管理,GC过程会照顾它)......?据我所知,似乎.net可以这样工作......我是对的吗?
答案 0 :(得分:4)
是否有一个由RTS创建的单独进程可以对Haskell二进制文件执行GC操作?
通常,垃圾收集不会要求一个单独的进程(例如,"后台"进程),尽管有些虚拟机垃圾收集器可能会这样做(我不知道) #39; t know)。
将垃圾收集器视为与堆分配器合并。无论何时要求分配一些内存,都要调用堆来执行此操作(在找到要分配的块之前可能会挂起一段时间)。使用垃圾收集器,只需要一个额外的步骤,垃圾收集器首先检查它是否应该在分配一些内存之前进行一些收集。
垃圾收集的核心是内存的工具(或注释),以便能够推断哪些内存块仍然被引用/可达。这种检测只是意味着在某些关键点期间的额外操作,如分配,释放(如果有明确的机制),以及设置/获取指针值(通常是"隐藏"在 - 下 - 垃圾收集语言中的引擎盖,而不是像C / C ++那样具有" raw"指针)的语言。
还有什么,如果有的话,是否有C / C ++的GC实现?
是的,C / C ++有各种各样的GC实现。它们不是非常流行的(AFAIK),可能是因为C足够低,通常可以管理,而C ++有RAII(和智能指针)几乎完全消除了对GC的需求。
但是如果你真的想要GC用于C / C ++,你当然可以得到它。有两个非确定性GC库(类似于JVM或.NET)和确定性GC库(类似于PHP或Python)。
据我所知,似乎.net可以这样工作......我是对的吗?
是的,.NET就像Java一样,是垃圾收集。从GC用户的角度来看,据我所知,.NET与JVM大致相同。
答案 1 :(得分:3)
所以我对这部分感到困惑,是否有一个由RTS创建的单独进程可以对Haskell二进制文件执行GC操作?
没有。为什么会这样?您不需要单独的过程来执行GC。 Java JVM不需要单独的进程。你似乎在某处有些困惑。您只需要运行时库中的一些代码。
更重要的是,如果有的话,是否有C / C ++的GC实现?
是
据我所知,似乎.net可以这样工作......我是对的吗?
如果你的意思是.NET有GC你是对的。如果你的意思是通过智能指针或单独的过程完成,那你就错了。