如何安排自定义标记扫描收集器的收集周期?

如何安排自定义标记扫描收集器的收集周期?,第1张

概述我为Postscript虚拟机编写了一个简单的垃圾收集器,我很难设计一套适当的规则,以便何时进行收集(当空闲列表太短时?)以及何时分配新空间(当有很多空间可供使用?). 到目前为止,我已经自下而上写过,但这个问题涉及到顶层设计.所以我觉得自己处于摇摇欲坠的状态. 管理所有对象并仅通过运算符函数进行访问,因此这是C中的收集器,而不是C中的收集器. 主分配器函数称为gballoc: unsigned 我为postscript虚拟机编写了一个简单的垃圾收集器,我很难设计一套适当的规则,以便何时进行收集(当空闲列表太短时?)以及何时分配新空间(当有很多空间可供使用?).

到目前为止,我已经自下而上写过,但这个问题涉及到顶层设计.所以我觉得自己处于摇摇欲坠的状态.
管理所有对象并仅通过运算符函数进行访问,因此这是C中的收集器,而不是C中的收集器.

主分配器函数称为gballoc:

unsigned gballoc(mfile *mem,unsigned sz) {    unsigned z = adrent(mem,FREE);    unsigned e;    memcpy(&e,mem->base+z,sizeof(e));    while (e) {        if (sZent(mem,e) >= sz) {            memcpy(mem->base+z,mem->base+adrent(mem,e),sizeof(unsigned));            return e;        }        z = adrent(mem,e);        memcpy(&e,sizeof(e));    }    return mtalloc(mem,sz);}

我确定在不知道所有类型和功能意味着什么的情况下是乱码,所以这里是相同功能的伪代码:

gballoc    load free List head into ptr    while ptr is not NulL        if free element size is large enough            return element,removed from List        next ptr    fallback to allocating new space

所以这是一个简单的“先适合”算法,没有雕刻(但是分配保留了它们的大小;因此,对于小对象重用的大空间可以再次用于大对象,稍后).

但什么时候应该拨打collect()?

编辑:
其余代码和相关模块已发布在线程中的comp.lang.postscript中:
http://groups.google.com/group/comp.lang.postscript/browse_thread/thread/56c1734709ee33f1#

解决方法 有几种适用的哲学:

>将垃圾收集作为最后一步避免在分配期间扩展堆.这可能是最常见的策略.
>定期进行垃圾收集,例如每百次分配或解除分配.在某些情况下,这可能会减少垃圾收集的总体工作量,而不会让碎片失控.
>不要做任何垃圾收集.始终是一种可能的策略,特别是对于短期或简单的程序.

作为垃圾收集的开发者,可能需要为应用程序选择策略,因为它可能知道哪个是最有效的.当然,如果它没有首选项,您应该选择默认值.

总结

以上是内存溢出为你收集整理的如何安排自定义标记扫描收集器的收集周期?全部内容,希望文章能够帮你解决如何安排自定义标记扫描收集器的收集周期?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1229470.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存