懵逼的说不知道。求大佬赐教一下。
1
txy3000 2019-07-01 14:34:16 +08:00 1
GC 是从栈中根节点作 BFS 去托管堆中遍历所有的对象并标记,然后干掉所有不可达的对象, 移动标记的对象到老年公寓。 好处是可以识别环, 解决循环引用。 具体的书, 如果是 C# :CLR VIA C#,JAVA:深入理解 JVM
|
3
txy3000 2019-07-01 14:37:32 +08:00
C++本身不带 GC BOOST 库 shared_ptr 建议去看官方文档
|
4
jmc891205 2019-07-01 14:38:46 +08:00 1
引用计数是 GC 的其中一种策略,是记录某个对象的引用数。当引用数变为 0 的时候,就可以销毁这个对象。
另一种被广泛应用的 GC 策略是基于 tracing。Gabage collector 会检查所有的对象是否在 root object 开始的链上是 reachable 的。那些不能被 reach 的对象就会全部被销毁。 前者的优点是可以尽快回收无用的内存,并且 GC 工作时不会导致程序运行造成太长的停顿。缺点是有循环引用的问题。 当然现在也有很多对两种 GC 进行优化的策略,尤其是基于 tracing 的 GC 对性能的影响越来越小之后,它比引用计数更受欢迎。 以上是我的理解,欢迎大家补充。 |
5
catror 2019-07-01 14:41:39 +08:00 via Android 1
引用计数是 GC 算法的一种,要问区别,得看对比的是哪种 GC 算法
|
6
mooncakejs 2019-07-01 14:42:52 +08:00 via iPhone 1
@v2byy 区别很多,这里最大的区别就是,gc 周期性的释放内存,有一个线程在后台清理。shared ptr 是实时释放。
|
7
noli 2019-07-01 15:29:00 +08:00 1
引用计数一般不被视为 GC 的手段,最主流的 GC 算法思想是 Mark and Swept,意思是标记垃圾然后清除。
这个过程中不含任何引用计数。 引用计数也无法达到 GC 的效果,因为引用计数无法使相互引用的多个对象引用计数降为 0,因此这些对象也不能正确析构。 |
8
LANB0 2019-07-01 21:28:56 +08:00 via Android
shared_ptr 和 GC 的关键区别不在引用计数,而在 RAI I。RAII 保证了引用计数的自动化。相反,GC 使用引用计数,是需要 GC 来处理计数算法的
|
9
exonuclease 2019-07-01 23:32:25 +08:00 via iPhone
shared_ptr 是用 reference counting 管理有多份引用的堆内存 有确定的释放时机 无法处理循环引用 一般说的 GC 是基于对象图的遍历的方法 可以处理循环引用 一般无法确定死的对象会在何时被回收
|