Haskell GHCs垃圾收集器(在移动设备上)的效率如何?

Haskell GHCs垃圾收集器(在移动设备上)的效率如何?,haskell,garbage-collection,Haskell,Garbage Collection,所以这一点以前肯定出现过几千次,但我刚刚读到了关于为什么Android和iOS上的垃圾收集速度非常慢的详细信息 其中一个要点是,只要有足够的空闲空间供收集器使用,垃圾收集就可以了 我的问题是:GHC的内存管理实现是否也易受此影响?可能会,尽管整个情况更加复杂。GHC主要使用复制收集器。当堆增长一定量时,会触发GC。由于复制采集器的策略是将活动对象复制到新内存中,因此有可用的空闲RAM非常重要,尽管这不是文章中指出的活动数据大小的6倍。GHC的IIRC约为最小值2.5-3倍 GHC还提供了一个压缩

所以这一点以前肯定出现过几千次,但我刚刚读到了关于为什么Android和iOS上的垃圾收集速度非常慢的详细信息

其中一个要点是,只要有足够的空闲空间供收集器使用,垃圾收集就可以了


我的问题是:GHC的内存管理实现是否也易受此影响?

可能会,尽管整个情况更加复杂。GHC主要使用复制收集器。当堆增长一定量时,会触发GC。由于复制采集器的策略是将活动对象复制到新内存中,因此有可用的空闲RAM非常重要,尽管这不是文章中指出的活动数据大小的6倍。GHC的IIRC约为最小值2.5-3倍


GHC还提供了一个压缩收集器,它几乎不需要那么多额外的RAM。压缩和复制收集方案之间的选择取决于内存使用情况和。

GHC的垃圾收集器可以进行一些非纯函数式语言无法实现的优化(我记得一些关于指针的内容,这些指针不能指向“未来”)(即,对于在包含对象之后创建的对象),因为一切都是不可变的)。但当然,每个非确定性垃圾收集器在某种程度上都容易受到内存不足问题的影响;我不希望GHC在这方面比JVM表现得好。@LeftArounda关于不能引用“未来”的指针的部分似乎有点可疑。Haskell很懒惰,创建任意大的周期不仅可能,而且也很琐碎,根据程序的不同,这些周期的某些部分可能会被创建并在代表周期其余部分的thunk被评估之前被提升到最老的一代。换句话说,一切都是可变的——当评估(替换为结果)。我的想法是Haskell中的大多数值都有一个非常明确的生存期。我想编译器应该知道何时删除一个值,在大多数情况下,在值超出范围后立即删除。只要它是纯函数,就应该可以确定几乎每个值的生存期?@Florian:这比t复杂一点hat,由于惰性/闭包。即使某个值超出范围,也可能会在闭包或thunk中捕获并需要保留,直到对其进行评估。我认为这可能是一种可行的方法,但GHC并不是这样做的。也许JHC/UHC以不同的方式管理内存,但我对这些实现不太了解。