免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5653 | 回复: 10
打印 上一主题 下一主题

研究了几天垃圾回收算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-19 22:35 |只看该作者 |倒序浏览
还是没找到满意的答案,

看来垃圾回收问题,是个世界性难题。

Cuer有创新的想法吗?

论坛徽章:
0
2 [报告]
发表于 2011-11-19 23:31 |只看该作者
本帖最后由 xyfree 于 2012-01-21 04:08 编辑

论坛徽章:
0
3 [报告]
发表于 2011-11-19 23:45 |只看该作者
代码没有,只有一些想法,比如:

1. 先用引用计数回收垃圾

2. 引用计数回收不掉的,通过变量的访问作用域回收(没有任何变量可访问到的内容,肯定算垃圾)

3. 上面两步都回收不到的,再通过搜索能否被root引用到的方式回收。

1,2能回收掉很大一部分。但是3仍旧不会有很即时的效率表现。

楼上有好想法没?

论坛徽章:
0
4 [报告]
发表于 2011-11-20 00:13 |只看该作者
你的垃圾回收器主要应用场景是什么呢?

如果你是在想给C/C++设计垃圾回收器,我就不大看好哦

ps.
通用的垃圾回收我也不看好哦

论坛徽章:
0
5 [报告]
发表于 2011-11-20 00:23 |只看该作者
本帖最后由 xyfree 于 2012-01-21 03:58 编辑

论坛徽章:
0
6 [报告]
发表于 2011-11-20 00:31 |只看该作者
回复 5# xyfree


    引用计数问题很多,以致于现代的stl库都不用引用计数了,特别是在多线程环境的问题。加锁性能太低,还不如拷贝,不加锁又不安全。

所以不用这个妖蛾子

论坛徽章:
0
7 [报告]
发表于 2011-11-20 01:56 |只看该作者
本帖最后由 xyfree 于 2012-01-21 03:58 编辑

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
8 [报告]
发表于 2011-11-20 09:04 |只看该作者
回复 6# walleeee


    我没弄明白引用计数跟多线程环境和stl库有什么关系。Android系统中提供了一个Binder框架用来做跨进程通信和远程调用(Remote Procedure Call),这个构架的最终基类就是一个引用计数类,整个构架的继承体系均虚继承自该类。进程之间的通信,通过进程中的线程引用一个代理对象,该代理对象就是用引用计数管理的。

论坛徽章:
0
9 [报告]
发表于 2011-11-20 10:24 |只看该作者
我认为,搞垃圾回收的语言就不应该保留内存分配接口,甚至根本就不要提供任何资源分配相关接口。


在这个基础上,可以这么做:

1、任何语言内置小/简单对象默认栈上分配;大对象则用分配于栈上的句柄和它在堆上的实际地址关联
2、如果对象return给外部,仍然用栈返回,转移控制权给外部(也就是拷贝构造于外部调用者的栈上)
3、如果对象传递给另外的线程,拷贝构造于对应线程的栈上(没错,不支持线程共享局部变量)
4、线程间共享数据必须是全局数据,或者必须用export声明;这种数据支持自动加锁(如果需要考虑效率,用traits选择即可),并且在程序退出时才会回收
5、变量赋值语义上等于引用。这种引用只需要为有名局部变量保留引用计数功能,即可实现自动回收。
赋值等于拷贝实现起来更简单,但效率不高。引用方案效率高,但机制较为复杂。
6、现在,资源管理就是局部对象管理,或者说局部对象作用域的管理。


至于所谓的对象内部的对象之类问题,纯粹是在垃圾回收语言里保留new之类东西导致的复杂化。
因为对象之内有对象,说白了还是一个复杂的局部对象。这个局部对象销毁时,直接删除内部的对象树即可——这就是所谓的基于引用关系的垃圾回收。
区别是,利用局部对象作用域来管理时,这个垃圾回收是实时的、等价于引用计数的,不需要额外的“幺蛾子”概念来掺乎的;不过,实时的回收效率可能比不上暂时不回收、攒多了一起回收效率高,这就是定时GC。

——码完字一看,这不差不多就是python嘛

论坛徽章:
0
10 [报告]
发表于 2011-11-20 11:02 |只看该作者
的确没有完美的解决方案,所以要在灵活性上加一些限制,或者制定更细致的规则,在一个特定的模式下,提一个实用的解决方案。

为什么java的垃圾收集算法这么成熟,而C++却没有太多成熟的库?

个人觉得最主要的原因是,C++中地址和整数可以随意转换,而java中从语法上限制了“地址”的赋值范围。(java中没有指针,但实质上是所有东西都是指针,且不能强制类型转换)。java中追溯一个对象有没有被引用相对容易,将全局变量和各个线程的函数调用栈中的变量遍历一遍即可。

引用计数其实性能并不低,在某些平台上,可以不用锁,而是用原子操作来实现。关键是要将引用计数作为一个强制规范,还要处理一些环形引用等。

或者像apr库那样,设定一个局部范围和对应的pool,范围内都从pool中申请,出了范围就直接把pool释放,虽然限制很大,但其实工程上足够用了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP