免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: 蔡万钊
打印 上一主题 下一主题

[技术动态] [转] 垃圾收集真的有用么? [复制链接]

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
31 [报告]
发表于 2013-09-17 16:21 |只看该作者
回复 30# starwing83

问题是出在细节上。想象一下一群对象共有一个对象的情况,这时候这个对象属于谁?这时候没有GC,就必须得有引用计数了,否则你就必须完全确定必定有一个对象肯定最后释放——即使它并不再被需要。


“引用/Reference”并不是“拥有/Own”,某个对象被一群对象“引用/Reference”并不代表它被一群对象“拥有/Own”,循环引用也并不代表循环“拥有”。
从这个角度来说,引用计数多少有点混淆了“引用/Reference”和“拥有/Own”这两者之间的区别。
Rust里面的各种指针/引用就试图解决这个问题,不过在我看来它把问题搞得更复杂了。

论坛徽章:
0
32 [报告]
发表于 2013-09-17 18:40 |只看该作者
回复 30# starwing83


1.“这时候这个对象属于谁”(或者作为其替代的有限弱化版本,例如不限定即时状态而是限定某个过程中)是作为程序员的用户必须搞清楚的基本问题之一,因为至少约定需要哪些资源是问题的解的一部分
2.这时候没有GC,也不见得需要引用计数。引用计数只是通用的替代方案(比GC略弱,不支持循环引用)。也有非GC的通用方法,但相对没GC那么有文章可做。比如最极端的情况下,所有资源属于程序本身,随着程序结束而销毁(静态对象)。在具体场合可以有更加明确的资源管理手段。比如确定分配和回收策略的对象池。
3.没错,就是要有向图。只不过同引用关系不同,这里的确定性所有关系特别强调组成有向无环图。
在对象的所有权无法构成DAG时,打破循环的最简便方法是设定其它所有者。理由很简单:既然其中没有能决定所有权的唯一对象,就可以把它们在“被所有”的角度上看成是一致的(而引用关系自然可以另外保留)。实际上,使用GC也正是这种策略的一种极端解决方法:所有对象都从属于GC,在“被GC所有”上是一致的——尽管GC不见得被看作语言内建支持的对象,但这并不妨碍资源管理的抽象。
那么问题就显然了。为什么需要用极端解法?
4.上面已经明确过GC在简化对象所有关系上并非必须。所以GC剩下的积极作用是另外一回事。对比a.b.c和a.b是为了说明GC对静态语言的某些能决定所有权的最基本特性上无用。这里需要再明确一下,所谓的访问并不是指任意的间接操作,而是能改变对象所有关系的操作,最典型地,创建和销毁(逻辑意义上的操作,不见得语言内建提供)对象。和对象池一样,GC在大量动态创建和销毁对象上有机会按需优化减小开销(尽管对于C++这样的静态语言基本无效,因为就算运行时创建对象,被创建的对象和新建的子对象或子对象引用的所有关系,以及其它已经创建了的对象的所有关系也不会被因此改变)。

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:11数据库技术版块每日发帖之星
日期:2015-08-30 06:20:00
33 [报告]
发表于 2013-09-19 14:33 |只看该作者
循环引用是程序员的问题, GC 解决循环引用的办法是,资源由 GC 这个虚拟的对象所有。

因此 GC 事实上就是 block_ptr 。尤其是那种分 二代GC 的,那就是更明确了,不止有个全局 block_ptr 有所有权, 还有个局部的 block_ptr, 只有局部的 block_ptr 无法管理,移动到 全局 block_ptr.

但是,java 里设计 GC 的人大概太仇视 C++ 了,导致 GC 并不能做到  block_ptr 的 “确定释放”。

从这一点上来说, GC 实在是太糟糕,太垃圾了。

那么 GC 到底什么时候有用呢?
有, 那就是你面对的都是一群不合格的程序员的时候,GC 非常的有用。
可以说,如果没有 GC, 这些人就面临着失业。



论坛徽章:
1
综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00
34 [报告]
发表于 2013-10-04 12:29 |只看该作者
花了30年时间制造了一堆垃圾。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP