我正在OCaml中编写一个符合ISO标准的Prolog系统。为了符合ISO / IEC 13211-1:1995,实现必须正确处理内存不足的情况:
7语言概念和语义
7.12错误
7.12.2错误分类
h)当处理器没有足够的资源来完成执行时,在执行的任何阶段都将出现资源错误。它具有以下形式:
resource_error(Imp_dep_atom)
其中Imp_dep_atom
表示依赖于实现的术语。
因此,符合ISO的Prolog系统必须提供以下三个功能:
resource_error(memory)
在堆空间用完时抛出。resource_error(stack)
在调用栈用完时抛出。catch/3
。到现在为止还挺好!借助“今天的技巧:带有Gc警报的内存限制” [discuss.ocaml.org],我能够实施软(应用程序级别)内存限制。
但是,当我连续多次运行特定查询(需要将〜60%的内存指定为软限制)时,发生了一些有趣的事情:每隔一段时间我就会得到一个答案,而每隔一段时间我就会耗尽内存。
就ISO一致性而言,这种行为还可以,但是我宁愿每次都得到一个答案而不是每隔一段时间就得到一个答案。h!
这应该是可行的,特别是如果限制我命中软(在OCaml的水平自我强加的)。
所以:我该如何强迫OCaml GC做更多(甚至更多)的工作Gc.compact
?
您可能正在寻找类似的东西:
Gc.set {Gc.get () with Gc.space_overhead = 40}
Gc.compact
是一种解决方案:在调用GC时,GC会做一些工作以释放空间。而且Gc.compact
,为了释放更多的内存,您不能让GC一次性完成更多的工作。之后Gc.compact ()
,只有实时数据存在于由OCaml保留用于堆的内存块中,如果保留的块数超过实际需要的数量,则释放了不必要的块,依此类推。
您想要的可能是GC永久性地花费更多时间以使用更少的内存。您可以通过设置space_overhead
参数来获得该行为max_overhead
。有关详细信息,请参见OCaml文档的相关章节:
类型控制= {…mutable space_overhead:int; (*
主GC速度是通过此参数计算的。这是将被“浪费”的内存,因为GC不会立即收集无法访问的块。它表示为用于实时数据的内存的百分比。GC可以工作如果space_overhead较小,则更多(使用更多的CPU时间并更热切地收集块),默认值:80。
同一章中记录的其他GC参数也可能间接影响内存消耗。这一切都取决于您愿意进行哪些交易以换取更少的内存使用量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句