用glib进行垃圾收集?

2024-04-17

我想将垃圾收集语言(具体来说,它使用古老的 Boehm libgc)与 glib 系列 API 接口。

glib 和 gobject 在内部使用引用计数来管理对象生命周期。包装这些的正常方法是使用垃圾收集的对等对象,该对象保存对 glib 对象的引用,并在对等点完成时删除该引用;这意味着当应用程序使用对等点时,glib 对象保持活动状态。我之前已经这样做过,并且它有效,但它非常痛苦并且有其自身的问题(例如生成同一底层对象的两个对等点)。

鉴于我已经承担了垃圾收集器的所有开销anyway,理想情况下我想做的是简单地关闭 glib 的引用计数并使用垃圾收集器来处理所有事情。这将无限简化界面并有望提高性能。

从表面上看,这似乎相当简单 --- 将垃圾收集器终结器连接到 glib 对象终结器,并将 ref 和 unref 函数重写为 noops --- 但进一步的调查表明,事情远不止这些: glib例如,非常喜欢保留自己的分配器池,当然我让它这样做,垃圾收集器假设池中的所有内容都是活动的,并且会泄漏。

说服 glib 使用 libgc 实际上可行吗?如果是这样,我可能还会遇到哪些其他问题?什么样的 glib 性能影响会迫使所有分配都通过 libgc 生成(而不是使用当前 glib 中的优化分配器)?

(glib 文档确实说它应该与垃圾收集器干净地接口......)


http://mail.gnome.org/archives/gtk-devel-list/2001-February/msg00133.html http://mail.gnome.org/archives/gtk-devel-list/2001-February/msg00133.html老了 但仍然相关。

学习语言绑定如何工作(代理对象、切换引用)可能有助于思考这个问题。

更新:哦,从 Boehm GC 听到的消息中,我认为您正在尝试用 GC 替换 g_malloc 等,就像那篇旧文章中那样。

如果您正在进行语言绑定(而不是 GC'ing C/C++),那么是的,这是非常可以实现的。 gjs (SpiderMonkey JavaScript) 代码库是一个很好且易于管理的示例。

基本思想是,您将拥有一个“保存”GObject 的代理对象,并且通常具有对该 GObject 的唯一引用。但是,唯一的复杂性是切换引用:http://mail.gnome.org/archives/gtk-devel-list/2005-April/msg00095.html http://mail.gnome.org/archives/gtk-devel-list/2005-April/msg00095.html

您必须将代理对象存储在 GObject 上,以便可以将其取回(假设有人执行 widget.get_parent(),那么您需要通过从 C GObject 检索它来返回之前设置为父对象的同一对象) 。显然,您还必须能够从代理对象转到 C 对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用glib进行垃圾收集? 的相关文章

  • Glib — 对 glib 中任何内容的未定义引用? [复制]

    这个问题在这里已经有答案了 我的 S 程序有问题 我需要用这个命令编译它 gcc I usr include glib 2 0 I usr lib x86 64 linux gnu glib 2 0 include lglib 2 0 D
  • 这个作用域/闭包什么时候在 javaScript 中被垃圾回收?

    我正在做一门课程 该课程正在讨论范围 闭包并简要提到垃圾收集 课程中提出一个问题 范围保持多久 答案是 直到 不再有任何提及它 是的 所以我们基本上说的是 是的 闭包有点像对隐藏范围对象的引用 所以只要有一些函数仍然有一个闭包 范围 该范围
  • numpy.ndarray 对象不被垃圾回收

    在尝试微调某些 C C 函数的 Python 绑定中的一些内存泄漏时 我发现了一些与 Numpy 数组的垃圾收集相关的奇怪行为 为了更好地解释这种行为 我创建了几个简化的案例 该代码是使用memory profiler 其输出紧随其后 当涉
  • RxJS - 我需要取消订阅吗

    如果我有这样的事情 class MyComponent constructor this interval Observbale interval 1000 const c new MyComponent const subscriptio
  • 为什么 Roslyn 中有这么多对象池的实现?

    The 对象池 http source roslyn codeplex com Microsoft CodeAnalysis ObjectPool 25601 cs 20b9a041fb2d5b00是 Roslyn C 编译器中使用的一种类
  • 使用对话框周围的语句来确保垃圾收集

    我们有一个包含数千个表单的 Windows 窗体应用程序 其中许多通过 ShowDialog 方法临时显示为对话框 该应用程序已经存在多年 我们发现由于表单或其使用的控件中的各种资源泄漏 许多表单没有及时进行垃圾收集 具体来说 我们发现了未
  • 垃圾收集器如何在幕后工作来收集死对象?

    我正在阅读有关垃圾收集的内容 众所周知 垃圾收集会收集死亡对象并回收内存 我的问题是 Collector 如何知道任何对象已死亡 它使用什么数据结构来跟踪活动对象 我正在研究这个问题 我发现GC实际上会跟踪活动对象 并标记它们 每个未标记的
  • 蜘蛛猴和垃圾收集

    我正在将 Spidermonkey 嵌入到我的 C 应用程序中 我需要在本机 C 中实现一些传递 jsval 的自定义 Javascript 函数 我需要防止 jsval 被意外垃圾收集 我这样做是否合适 1 在初始化例程中 static
  • 调整 Java 类以提高 CPU 缓存友好性

    在设计java类时 对于实现CPU缓存友好性有哪些建议 到目前为止我学到的是应该尽可能多地使用 POD 即 int 而不是整数 这样 在分配包含对象时 数据将被连续分配 例如 class Local private int data0 pr
  • 使用 using 来处理嵌套对象

    如果我有像这样的嵌套对象的代码 我是否需要使用嵌套的 using 语句来确保 SQLCommand 和 SQLConnection 对象都被正确处理 如下所示 或者如果实例化 SQLCommand 的代码位于外部使用语句 using var
  • 如果垃圾收集器没有删除未引用的对象,它们还能运行吗?

    如果一个对象正在等待垃圾收集 但包含一个在该对象的最后一个引用更改时正在运行的线程 那么该线程是否仍会运行并且代码是否仍会执行 那么您是否可能有一堆应该删除的幽灵对象 但它们对您的代码产生了影响 你如何防止这种情况发生 有没有办法让对象知道
  • C++ 中的垃圾收集——为什么?

    我不断听到人们抱怨 C 没有垃圾回收功能 我还听说 C 标准委员会正在考虑将其添加到该语言中 恐怕我只是不明白它的意义 使用 RAII 和智能指针消除了它的需要 对吗 我唯一的垃圾收集经验是在几台廉价的八十年代家用计算机上 这意味着系统会时
  • 未分配给变量的类实例是否会过早被垃圾回收?

    我什至不知道我的问题是否有意义 这只是我不明白的事情 并且在我的脑海中旋转了一段时间 考虑有以下课程 public class MyClass private int myVar public void DoSomething Do som
  • 新的自动引用计数机制如何工作?

    有人可以简单地向我解释一下 ARC 的工作原理吗 我知道它与垃圾收集不同 但我只是想知道它到底是如何工作的 另外 如果 ARC 的作用与 GC 的作用相同且不影响性能 那么 Java 为什么要使用 GC 为什么它不使用 ARC 呢 每个接触
  • 如果我再次使其可用,“最终确定”的对象会发生什么情况?

    好吧 我尝试制作一个最终确定的 object 再次可用 我知道 从甲骨文文档 http docs oracle com javase 7 docs api java lang Object html finalize that finali
  • Java GC 中的压缩是什么?

    I read http www cubrid org blog tags Garbage 20Collection http www cubrid org blog tags Garbage 20Collection 文章提供了 Java
  • 对于所有 JVM GC 实现来说,压缩真的是不可避免的吗?

    On this link http www azulsystems com technology c4 garbage collector据说 这些暂停是不可避免的压缩要求的结果 堆以释放空间 收藏家使用不同的策略 推迟这些事件 但是压缩是
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • 使用标准 C++/C++11,14,17/C 检查文件是否存在的最快方法?

    我想找到最快的方法来检查标准 C 11 14 17 或 C 中是否存在文件 我有数千个文件 在对它们进行操作之前 我需要检查它们是否全部存在 我可以写什么来代替 SOMETHING 在下面的函数中 inline bool exist con
  • 如何在 cakephp 3.x 中执行自定义查询

    cakephp 中的自定义查询执行 我已经应用了下面的代码 conn ConnectionManager get default rs conn gt query SELECT FROM customers 但它给了我空白数组custome
  • 通过更改 build.xml 和 ant.properties 生成 Android 代码覆盖率

    我一直在尝试为我的 android 测试项目生成 android 代码覆盖率 该项目测试包含外部 jar 的 android 项目 当我运行命令时 ant emma install debug test 它仅显示了 android 项目的覆
  • PHP:删除数组的第一项和最后一项

    假设我有这个数组 array array 10 20 30 30 40 50 问题 从上面的数组中删除第一项的最快 最简单的方法是什么 从上面的数组中删除最后一项的最快 最简单的方法是什么 因此生成的数组仅包含这些值 20 30 30 40
  • 构建后如何在 Windows 上安装 Qt?

    我找不到任何有关如何安装基于 Windows 的 Qt 的信息 在维基文章中如何在 Mac 和 Linux 上设置影子构建 http developer qt nokia com wiki Qt shadow builds有描述 prefi
  • SQL Server 导入和导出向导导出到 PostgreSQL 时出错

    我正在尝试使用 SQL Server 的导入和导出向导 SQL Server 2008 R2 导出 SQL Server 数据库 数据库模式在目标 PostgreSQL 数据库中创建得很好 大部分数据也是如此 仅当我尝试导出具有以下内容的列
  • org.apache.hadoop.security.AccessControlException:尝试在 EC2 上使用 Hadoop Java API 通过 s3n URI 访问 S3 存储桶时权限被拒绝

    Scenario 我创建一个名为 my role 的 AWS IAM 角色 将 EC2 指定为可信实体 即使用信任关系策略文档 Version 2012 10 17 Statement Sid Effect Allow Principal
  • 获取 ORA-02391: SESSIONS_PER_USER 限制

    是否有一个查询可以用来获取我可以同时使用的会话数量 我正在线程化一些数据库连接并收到错误 ORA 02391 超出同时 SESSIONS PER USER 限制 我怎样才能得到这个限制的值 从这个查询开始找出您正在使用多少个会话 selec
  • 具有动态别名的动态虚拟主机

    我在用DNSMasq对于此设置 我在使用 Alias 时遇到问题 因为它对于动态虚拟主机根本不起作用 并且不存在这样的事情VirtualAlias在 Apache 文档中 我正在尝试像以前一样设置我的新环境 devtld 但我遇到了问题 因
  • 使用 Unity 3D 移动鼠标时相机跟随玩家

    我有一个简单的脚本 当我转动相机时 可以移动和环顾四周 但相机不随角色转动 我如何让它们一起转动 using System Collections Generic using UnityEngine public class PlayerF
  • React.js - 在表单提交时和之后显示一条消息

    提交表单时 我想显示 请稍候 并在成功提交后显示从服务器返回的数据 使用 jQuery 这很容易做到 但应该有一种 React 方式 因为 React 不喜欢这种直接的 DOM 操作 我认为 1 我对吗 2 如何在表单提交时 而不是之后 显
  • 如何改进此代码的功能[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 a1 input Enter an 8 bit binary number to convert a1 list a1 ok False i
  • JavaFX FXML 控制器 - 构造函数与初始化方法

    My Application类看起来像这样 public class Test extends Application private static Logger logger LogManager getRootLogger Overri
  • 是否可以使用多线程而不需要一遍又一遍地创建线程?

    首先 再次感谢所有已经回答我问题的人 我不是一个经验丰富的程序员 这是我第一次体验多线程 我有一个与我的问题非常相似的例子 我希望这可以缓解我们的情况 public class ThreadMeasuring private static
  • 使用 python 进行简单的 ascii url 编码

    看那个 import urllib print urllib urlencode dict bla 输出是 bla C3 BC 我想要的很简单 我想要 ascii 格式的输出而不是 utf 8 格式的输出 所以我需要输出 bla C3 如果
  • 此链接内的链接和跨度的文本装饰

    我有类似的链接 a href Link text span Link sub text span a 悬停时 我需要跨度内的文本不带下划线装饰 但主链接文本是 是否可以 我试过了 a hover span text decoration n
  • 如何更改列表中的ListStyle

    在 SwiftUI 中List似乎有一个名为ListStyle 如何更改列表的样式 struct ListView View var body some View NavigationView List Item create identi
  • jQuery document.ready 与 pageLoad

    我从另一位开发人员那里挑选了一个现有项目 我在代码中注意到他们正在三个不同的事件处理程序中执行 js 代码 function pageLoad execute code document ready function execute cod
  • ASP.NET MVC 中 ViewModel 的验证

    大多数关于如何在 ASP NET MVC 中实现验证的技巧似乎都以模型为中心 在模型和控制器之间构建服务层 或者使用验证属性装饰模型的属性 在我的应用程序中 我使用 ViewModel 进行控制器和视图之间的所有通信 我的登录页面有一个名为
  • 用glib进行垃圾收集?

    我想将垃圾收集语言 具体来说 它使用古老的 Boehm libgc 与 glib 系列 API 接口 glib 和 gobject 在内部使用引用计数来管理对象生命周期 包装这些的正常方法是使用垃圾收集的对等对象 该对象保存对 glib 对