Questions tagged «garbage-collection»


2
分代垃圾收集器本质上是缓存友好的吗?
典型的世代垃圾收集器将最近分配的数据保留在单独的内存区域中。在典型程序中,大量数据是短命的,因此,频繁收集年轻垃圾(较小的GC周期)而很少收集旧垃圾是内存开销和执行GC时间之间的良好折衷。 直觉上,随着主内存相对于高速缓存的等待时间比率的增加,与单区域垃圾收集器相比,世代垃圾收集器的好处应该增加,这是因为经常访问年轻区域中的数据并将它们全部保存在一个地方。实验结果是否证实了这种直觉?

7
为什么在垃圾收集语言中普遍缺少对象析构函数范式?
寻找有关垃圾收集语言设计决策的见解。也许语言专家可以启发我?我来自C ++背景,所以这个领域令我感到困惑。 似乎几乎所有具有OOPy对象支持的现代垃圾收集语言(如Ruby,Javascript / ES6 / ES7,Actionscript,Lua等)都完全省略了析构函数/定型化范例。Python似乎是唯一使用它的class __del__()方法。为什么是这样?在具有自动垃圾收集的语言中,语言是否存在功能/理论上的限制,从而无法在对象上有效实现析构函数/完成方法? 我发现非常缺乏这些语言将内存视为唯一值得管理的资源。套接字,文件句柄,应用程序状态如何?由于无法实现自定义逻辑以清除对象最终确定中的非内存资源和状态,因此我需要使用自定义myObject.destroy()样式调用来填充我的应用程序,将清除逻辑置于“类”之外,破坏尝试的封装,并降级我的应用程序由于人为错误而导致资源泄漏,而不是由gc自动处理。 什么是语言设计决策,这些决策导致这些语言无法对对象处理执行任何自定义逻辑?我必须想象有一个很好的理由。我想更好地理解导致这些语言不支持对象销毁/完成的技术和理论决策。 更新: 也许更好的方式表达我的问题: 为什么一种语言会具有带有类或类结构以及自定义实例化(构造函数)的对象实例的内置概念,却完全省略了销毁/最终确定功能?提供自动垃圾收集的语言似乎是支持对象销毁/完成的主要候选方法,因为他们知道当不再使用某个对象时会100%确定。但是,其中大多数语言都不支持它。 我认为在这种情况下可能永远不会调用析构函数,因为那将是核心内存泄漏,gcs旨在避免这种情况。我可以看到一个可能的论点是,直到将来某个不确定的时间,析构函数/ finalizer才会被调用,但这并没有阻止Java或Python支持该功能。 不支持任何形式的对象完成的核心语言设计原因是什么?

4
垃圾收集器如何避免堆栈溢出?
因此,我在考虑垃圾收集器的工作方式,并想到了一个有趣的问题。大概垃圾收集器必须以相同的方式遍历所有结构。他们不知道正在遍历链表或平衡树之类的天气。他们也不会在搜索中消耗过多的内存。我想到遍历所有结构的一种可能方法,也是唯一的方法,可能就是像使用二叉树那样递归遍历所有结构。但是,这会在链表甚至平衡差的二叉树上产生堆栈溢出。但是我曾经使用过的所有垃圾收集语言似乎都没有问题的处理能力。 在龙书中,它使用各种“未扫描”队列。基本上,而不是递归遍历结构,它只是将需要标记的内容添加到队列中,然后针对未标记的所有内容将其删除。但是这个队列不会很大吗? 那么,垃圾收集器如何遍历任意结构?这种遍历技术如何避免溢出?

2
是否有任何考虑分页的垃圾收集器?
垃圾回收必须访问所有存在的对象,以便找到可以回收的内存。(有很多世代只是延迟了一下) 在所有条件都相同的情况下,最好先访问已分页到RAM中的对象,然后再分页其他块并分页出某些对象。 另一种可能是,当OS希望从进程中删除一整页的内存时,首先会询问GC是否具有可以放弃而无需分页的页面。GC通常可以通过从页面移动对象来完成,因此可以在OS需要页面的限期内清除该页面。 但是,我想不起任何与OS分页系统集成的垃圾收集器,这些垃圾收集器会驱动GC的工作顺序。

6
为什么垃圾回收仅扩展到内存而不扩展到其他资源类型?
似乎人们厌倦了手动内存管理,于是他们发明了垃圾回收器,生活还算不错。但是其他所有资源类型呢?文件描述符,套接字,甚至用户创建的数据(如数据库连接)? 这听起来像是一个幼稚的问题,但是我找不到任何有人问过的地方。让我们考虑文件描述符。假设某个程序知道启动时仅允许有4000 fds。每当它执行将打开文件描述符的操作时,如果会 检查以确保它不会用完。 如果是这样,则触发垃圾回收器,这将释放一堆内存。 如果某些内存释放了对文件描述符的保留引用,请立即将其关闭。它知道该内存属于某个资源,因为与该资源绑定的内存在首次打开时就注册了一个“文件描述符注册表”,但缺乏更好的用语。 打开一个新的文件描述符,将其复制到新的内存中,将该内存位置注册到“文件描述符注册表”中,并将其返回给用户。 因此,资源不会立即被释放,但是只要gc至少在资源即将用完之前就运行,只要它没有被完全利用,它将至少被释放。 对于许多用户定义的资源清理问题而言,这似乎就足够了。我设法在这里找到一条注释,该注释在C ++中使用类似于包含对资源的引用的线程的方式进行类似于C ++的清理,并在仅剩一个引用(来自清理线程)时对其进行清理,但是我可以找不到任何证据表明这是图书馆或任何现有语言的一部分。

3
参考计数GC与跟踪GC是语言属性还是实现属性?
有时我们会听到“ Swift不执行经典(跟踪)GC,而是使用ARC。” 但是我不确定Swift语义中是否有需要引用计数的内容。似乎可以构建自己的Swift编译器和运行时以使用跟踪GC。 那么Swift的“引用计数”到底是什么?苹果的实现还是语言本身?语言或库中是否有某些部分强烈支持ARC,因此我们可以为语言本身使用该标签?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.