问题标签 [mark-and-sweep]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - (U) Ruby 扩展:rb_gc_mark() 和实例变量
我正在编写一个定义类的 ruby 扩展。如果我Data_Wrap_Struct()
用来实现我的回调rb_define_alloc_func()
,我是否需要手动标记和释放实例变量?或者这仍然为我处理?
java - Concurrent Mark & Sweep 中的“由于时间原因中止预清理”
在 Java 6 中运行 Concurrent Mark & Sweep 时出现“由于时间原因中止预清理”。这是什么意思?GC 真的在做任何实际工作之前就在中间停止了吗?
c++ - 关于 C++ 中垃圾收集的标记扫描(惰性方法)?
我知道引用计数器技术,但直到今天在阅读名为“编程语言概念”的书时才听说过标记扫描技术。
根据书:
垃圾回收的原始标记清除过程操作如下:运行时系统根据请求分配存储单元,并根据需要断开与单元的指针,而不考虑存储回收(允许垃圾积累),直到它分配了所有可用的单元。此时,开始进行标记清除过程,以收集在堆中漂浮的所有垃圾。为了促进该过程,每个堆单元都有一个额外的指示位或字段,供收集算法使用。
根据我有限的理解,C++ 库中的智能指针使用引用计数技术。我想知道 C++ 中有没有使用这种智能指针实现的库?而且由于这本书纯粹是理论性的,我无法想象实现是如何完成的。一个证明这个想法的例子将非常有价值。如果我错了,请纠正我。
谢谢,
java - 使用 finalize 作为排他锁
如果我使用 stop-the-world GC 并在我的方法中做一些事情,我finalize()
是否可以假设所有线程都被挂起,我可以做任何我想做的事情,除了 GC 线程之外,没有线程敢与我竞争资源?
memory - 为什么引用计数 GC 被污名化?
我曾经在某个地方读到过一个关于理想主义但“懒惰”的程序员尝试实现编程语言的共同想法。如下:-
“我知道,我会做一个易于实现和快速编写的引用计数 GCer,然后在我有时间的时候将它重新实现为真正的 GCer。”
自然,这种重新实现永远不会发生。
但是,我质疑为什么需要这样的重新实现。为什么增量和并发种类的标记和清除收集器被认为优于 Perl 5 和 Python 等语言采用的所谓过时的方法?(是的,我知道 Python 通过标记和清除收集器增强了这种方法。)
循环引用是此类讨论中提出的第一个主题。是的,这可能会很痛苦(请参阅 Perl 中的递归代码引用,并修复它涉及多个分配和引用削弱。)是的,当编码人员必须不断监视此类引用的引用时,它就不那么优雅了。
替代方案更好吗?我们可以讨论永恒的细粒度实现细节,但事实是,大多数标记和清除 GC 实现存在以下问题:-
- 资源的非确定性破坏,导致代码难以推理且过于冗长(请参阅 .NET 中的 IDispose 或许多其他语言中的 try/finally 替换。)
- 不同类别的垃圾的额外复杂性,对于短期、长期以及介于两者之间的所有内容,这种复杂性似乎是合理性能所必需的。
- 要么需要另一个线程,要么需要定期停止程序的执行以执行收集。
标记和清除的失败是否可以解决引用计数问题,这些问题可以通过弱引用来缓解?
c - 为什么在 GC 中使用白色/灰色/黑色?
我正在使用我正在研究的简单脚本语言 API 实现标记和清除垃圾收集,并且一直在阅读有关垃圾收集的各种实现的信息。诸如 Lua 之类的 API 对白名单、灰名单和黑名单使用标记和清除。
问题是,我似乎无法解释为什么会有这样的列表以及为什么将它们放入这些特定的颜色中。
在我当前的简单实现中,我只是使用“死”或“活”状态。在扫描中,死对象被删除。我正在使用本机堆,所以我没有在我的 GC 中做任何移动。
我正在用 C 编写它。
garbage-collection - 如何将引用存储在标记和清除垃圾收集器中?
在最近的一个周末,我开始编写自己的脚本语言,以获取学习经验和高中毕业时的简历。到目前为止一切都很好,我可以解析具有基本类型(null、布尔值、数字和字符串)的变量和具有运算符优先级的数学表达式,并且有一个基本的标记和清除垃圾收集器(在完成标记/清除收集器之后我将实现一个分代垃圾收集器,我知道天真的标记/扫描不是很快)。不过,我不确定如何为垃圾收集器存储引用的对象。到目前为止,我有一个 GCObject 类,它存储一个指向它的内存的指针,以及它是否被标记。我应该存储一个链接列表吗?类中引用的对象?我查看了其他语言的垃圾收集器,但我没有看到每个 GCObject 的引用链接列表,所以这让我感到困惑。
TLDR:如何将其他对象引用的对象存储在标记和清除垃圾收集器中?我是否只在我的所有 GCObjects 中存储对象的链接列表?
多谢你们。
c++ - 什么时候需要在 Ruby C 扩展中声明 volatile VALUE?
我找不到太多关于何时适合在 Ruby 扩展中声明 a VALUE
asvolatile
以避免过早地对使用中的对象进行垃圾收集的文档。
这是我到目前为止所学到的。任何人都可以填空吗?
什么时候volatile
不需要使用:
- 在 C++ 对象成员中(因为它们从不在堆栈上?)
- 在不调用 Ruby API 的 C/C++ 方法中(因为在调用 Ruby API 之前 GC 不会打开)
什么volatile
时候需要使用
- 在调用任何 Ruby
ALLOC
或malloc
宏/函数的 C/C++ 方法中(因为这些可以在内存高度碎片化时触发 GC) - 在调用任何 Ruby 函数的 C/C++ 方法中(例如,、、
rb_funcall
等rb_ary_new
)
其他避免GC的方法
VALUE
正在使用的标记- 在对象创建期间禁用 GC,然后重新启用它
- 不要使用 Ruby 的分配方法(有风险)
一切都正确吗?我缺少什么细节?除了标记,是volatile
唯一的方法吗?
javascript - DIY Script language garbage collection (mark & sweep)
I'm working on some simple script language and I need a help in understanding how garbage collector works. As far as I understand it, garbage collector has two things:
Object pool - contains all allocated objects, can be represented as simple array. When VM creates an object (Number, String and etc) it creates appropriate instance and pushes it into the object pool:
/li>Frame (not sure if it's right term) - contains references to the objects in objectPool. When we create a variable and assign a value to it, VM creates entry in the Frame. When we need to get variable value we look it in the frame. Frame can be represented as hash map:
/li>
Garbage collection (at least mark & sweep implementation), contains two steps:
Mark: walk through the objects that is contained in frame and mark them:
/li>Sweep: walk through the objects that is contained in objectPool and remove (free) all unmarked ones:
/li>
Am I missing anything? Is this all looks correct?
android - 垃圾收集将标记位放在一起和分开有什么优点和缺点
我正在观看视频Google IO 2008 - Dalvik Virtual Machine Internals以了解 Dalvik VM 的工作原理以及为什么这些人更喜欢 Dalvik VM 而不是 JVM for android。我发现 android 使用单独的内存来存储有关对象的垃圾信息,这与我们将标记位(告诉对象是否能够进行垃圾收集的位)与对象一起使用的 JVM 不同。
谁能详细告诉我为标记位设置单独的内存而没有为标记位设置单独的内存的优缺点是什么?
我无法通过观看视频来获得这种差异。