我听说它非常笼统地提到存在这样的事情,但很少讨论细节。你最喜欢的是什么?是什么让它变得困难?
答案 0 :(得分:4)
许多无锁结构(如并发哈希表)的标准实现通常几乎不可能在没有垃圾收集器的情况下编写。这些结构的工作原理是存储长链接的元素列表,然后在添加或删除新值时更改列表的头部。这样,一个线程可以对结构进行更改,以便新线程看到更改(它们遍历新的链接列表),而较旧的线程继续读取较旧的链接列表。垃圾收集器回收内存至关重要,因为否则更改链接列表的线程必须以某种方式清理它刚刚替换的列表,但该列表正在被其他线程使用,这会导致数据争用或需要使用锁,两者都不好。
对于使用相关技巧的多线程无锁二进制搜索树,可以进行类似的论证。
答案 1 :(得分:3)
没有GC,一切皆有可能,因为计算机硬件在没有GC的情况下工作,它会计算所有算法。 :-)但有时候更容易实现本地GC并使用它而不是编写一个巨大的复杂代码来做同样的事情而不用GC。在现实世界中,使用GC的算法通常比非GC的算法简单得多。
在没有某种垃圾收集的情况下,产生大量时态数据/变量的任何东西都是一个大问题(即困难,技术上不可能)。例如,想象一下具有php或asp.net支持的web服务器,其中php / c#scripts的引擎没有垃圾收集。来自浏览器的每个Web请求都会在Web服务器上创建大量临时数据,如果您在服务器上的脚本中只有少量内存泄漏,整个Web服务器就会以可怕的方式死亡......
我的意思是,如果很多人将脚本或插件放到服务器上,就会出现内存泄漏。这些场景需要某种垃圾收集。
C#中的LINQ也创建了许多临时对象。没有垃圾收集就可以使用它。
答案 2 :(得分:3)
我猜想你的意思是并发数据结构。如果是这样,许多无锁算法需要垃圾收集(或延迟/安全内存回收)。最简单的例子是经典的无锁堆栈: [按“ABA问题”搜索维基百科 - 该网站禁止我发布链接] (ABA和安全内存回收是密切相关的问题,如果解决后者而不是解决前者问题) 没有GC,是不是不可能实现它们?不,这不是不可能的。但是,这肯定更难。 一种解决方案是实施有限形式的GC。例如,强线程安全引用计数: http://www.1024cores.net/home/lock-free-algorithms/object-life-time-management/differential-reference-counting 另一种解决方案是围绕需求设计算法,这样它就不需要GC。例如,一些无锁生产者 - 消费者队列(最值得注意的是M& S队列)确实需要GC。这是一个简单的高效队列算法,专门针对GC要求设计: http://www.1024cores.net/home/lock-free-algorithms/queues/non-intrusive-mpsc-node-based-queue
答案 3 :(得分:0)
var v = FunctionThatAllocatesMemory2(FunctionThatAllocatesMemory1());
如果没有GC,则无法释放FunctionThatAllocatesMemory1()
返回的内存。