- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试实现一种小型脚本语言,并打算决定哪种垃圾收集算法适合我的利益。我选择了 Mark & Sweep,但我想我误解了这个概念。
假设调用了一个任意函数,它创建了以下变量(可能它们没有名称,但为了简单起见,假设它们是在这个函数中创建的)。
f() {
/*f creates following variables*/
x = (1,2,(3,4,(5,6))); //this is tuple
a = x;
y = x[2];
z = y[2];
p = (10,y);
}
在上面的例子中,一切都是对象(整数、字符串、元组、 double 等),元组持有指向其对象的指针。此外,每个对象都存在于堆中。当函数超出范围时,它必须删除分配的变量。函数作用域如下所示。
+-----+
| |
| x +---------->(1,2,+)
+-----+ ^ |
| v
+-----+ | (3,4,+)
| | | ^ |
| a +-----------+ | v
+-----+ | (5,6)
| ^
+-----+ | |
| | | |
| y +----------------+ |
+-----+ | |
| |
+-----+ | |
| | | |
| z +---------------------+
+-----+ |
|
+-----+ |
| | |
| p +----------->(10,+)
+-----+
必须删除所有变量(a、x、y、z、p),但问题是如何删除?我知道 Mark & Sweep 是一种垃圾收集算法,我认为这些变量现在是我的垃圾。函数完成了它的工作,它必须将分配的内存返回给系统。
我试过以下,每个对象都有一个标记位,创建后标记位设置为 0。当程序推送一个由变量保存的对象时,它会将其标记转换为 1,并且不会发生自由错误,因为每个人都在程序知道它有一个所有者。到目前为止,这种方法已经奏效了。但是如果我有很多像示例中的变量,我该如何删除多个指针?
这里我的假设是,首先打破 x 和它的对象之间的所有权。然后说每个变量来标记它们的对象(如果对象是元组,则递归地将其对象标记位设置为 1)。现在 (1,2,...) 对象的标记位被变量 'a' 设置为 1;我可以尝试释放它,但程序不允许。如果我为我的表中的每个变量都做这个,复杂性看起来会很大(我对每个对象都有标记和清除阶段)。
我的问题是我对 Mark & Sweep 算法的看法是否正确?根是我的变量吗?如何删除多个指针甚至循环引用?
最佳答案
对于标记和扫描,您需要能够在一侧扫描所有已分配的对象,在另一侧扫描所有可到达的对象。
假设所有已分配对象上的标记位都已清除,则扫描所有可从根变量访问的对象。当找到一个对象时,如果它已经被标记,则跳过它,否则标记它并递归枚举它指向的对象。这个阶段很棘手,因为这种递归可能会太深,因此需要比普通递归更聪明的方法。
一旦标记了所有可达对象,扫描所有分配的对象:对于每个对象,如果标记了,清除标记,否则不可达,因此收集它(即:使其可用于重新分配或释放它)。
在 Sweep 阶段结束时,所有分配的对象都未标记,因此假设成立。稍微更高效的实现会在 2 个状态之间交替,避免需要清除可达对象上的标记位,从而减少扫描阶段所需的内存带宽。
当您在程序的正常过程中更改对象引用时,您不需要做任何特殊的事情:只需存储新引用的地址。
要有效地删除从您的全局变量中引用的对象,您应该使这些变量指向null
或其他一些对象。
Mark & Sweep 的优点是算法相对简单,并且能够收集带循环的复杂结构。缺点是在stop the world 模式下花费的时间,特别是在多线程应用程序和实时应用程序甚至用户交互应用程序中。已发现更先进的方法来处理这些问题,但它们的实现可能非常棘手。
关于c - 多个指针和标记和扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55075272/
虽然我在 reactjs 组件(组件名称为 renderLocationLink)的渲染方法返回的 html 中包含了 a 标签的 onclick 处理程序,但渲染正确地发生了 onclick 处理程
我必须以 docx 格式存储一些文档,但无法忍受使用 msword:我想编辑某种纯文本标记,除了基于 XML 的东西(我也不喜欢那样)和从/到那个到/从 docx 转换。 有什么选择吗? 编辑:由于人
有一个页面,其 anchor 标记在延迟后变得可点击。我想使用用户脚本在可点击后点击它。 页面加载时,HTML 源代码为: Download 延迟一段时间后,#button 变
我正在将 XML 文件解析为 pandas 数据帧。使用下面的代码我可以成功获取所有内容,但是这使用了完整 XML 的编辑版本。完整的 XML 在主数据表之上有一堆摘要数据,请参阅完整的 XML he
目前我正在研究 xml.sax 解析器来解析 xml 文件 假设我有以下代码 filepath = 'users/file.xml' try: parser = xml.sax.make_pa
我正在尝试构建一种语法来解释用户输入的文本,搜索引擎风格。它将支持 AND、OR、NOT 和 ANDNOT bool 运算符。我几乎所有东西都在工作,但我想添加一个规则,将引用字符串之外的两个相邻关键
我遇到了 Terraform EKS 标记的问题,并且似乎没有找到可行的解决方案来在创建新集群时标记所有 VPC 子网。 提供一些上下文:我们有一个 AWS VPC,我们在其中将多个 EKS 集群部署
我是xpath的新手,对此了解不多。我知道有一种方法可以使用xpath在xml / xhtml文件中查找特定标签。就我而言,我试图找到第一个(a)链接元素。不幸的是,我的xpath字符串[// a [
我在索引页上的产品卡上遇到问题。在产品卡内部,我有 Vue 组件来渲染表单(数量和添加到购物车按钮)。当我单击“添加到购物车”按钮时,我得到了预期的结果。响应被发送到根 vue 组件,然后我看到产品已
html setMouse(true)} onMouseEnter={() => setMouse(false)} className='resume-container'> CSS .resum
我在组件中有一组枚举,如下所示: type TOption = (clVisible, clVisibleAlways, clRenderable, clEditable); TOptions
是否有出于性能考虑的javadoc标签? 人们可以想象: /** * ...other javadoc tags... * @perform Expected to run in O(n) tim
html setMouse(true)} onMouseEnter={() => setMouse(false)} className='resume-container'> CSS .resum
我有一个包含多个小子图的图。目标是当且仅当子图中的所有节点都是蓝色时,才将子图中的所有蓝色节点标记为红色。如果子图中的一个节点具有不同的颜色,绿色,那么我们将不会更改该子图中节点的颜色。 这是我正在使
我正在使用 json-ld 开发事件标记以包含在确认电子邮件中。 我的一些事件会定期重复发生。但是,最新的 Schema.org 规范不支持重复发生的事件,因此我遵循了此处提供的建议:http://l
我创建了一个插件,可以添加带有相应行号的标记。现在,这很棒,因为它现在显示在“标记” View 中。有没有办法当我双击标记上的一行时,它会转到标记指示的行? 谢谢。 最佳答案 双击“标记” View
是否有一个插件具有与 Facebook 标记类似的行为? 它的特别之处在于它具有: 在键入的单词之间自动完成 特殊输出的 html(与另一个输入字段同步) 最佳答案 您可以使用jquery提及输入pl
有没有更好的方法来读取java文件中的 token ?我目前正在使用 StringTokenizer 来分割 token 。但在大多数情况下,它的效率可能非常低,因为您必须逐个 token 地读取 t
我想知道是否有某种方法可以标记文件来识别该文件是否包含x。 考虑以下示例: 在批量转换过程中,我正在创建一个日志文件,其中列出了各个转换的成功/失败。 所以流程如下: 开始转换过程 创建名为batch
我一直在尝试模拟点击标签,但这并没有像我需要的那样工作。我的 anchor 标记看起来像这样 Download this pic 正常的 $("a").click() 或 trigger('cli
我是一名优秀的程序员,十分优秀!