我正在读这个, 这里是原始 ps 文件。 http://www.hpl.hp.com/personal/Hans_Boehm/gc/myths.ps)
GC 误区 3:垃圾收集器总是比显式内存释放慢。
GC 误区 4:垃圾收集器总是比显式内存释放更快。
这对我来说真是天大的事。 GC 如何比显式内存释放更快?当它释放内存/使其再次使用时,它本质上不是调用显式内存释放器吗?所以....wtf....这实际上是什么意思?
非常小的物体和大的稀疏物体
堆 ==> GC 通常更便宜,
尤其是对于线程
我还是不明白。这就像说 C++ 比机器代码更快(如果你不明白这句话中的 wtf,请停止编程。让 -1 开始)。经过快速谷歌后,一位消息人士建议,当你有大量内存时,速度会更快。我的想法是,这意味着它根本不会打扰免费。当然,这可以很快,而且我已经编写了一个自定义分配器,它可以做到这一点,而且根本不是免费的(void free(void*p){}
)在一个不释放任何对象的应用程序中(它仅在终止时释放)并且主要在 libs 和 stl 之类的情况下具有定义。所以...我很确定这会让 GC 更快。如果我仍然想要释放,我想我可以使用一个使用双端队列或其自己的实现的分配器,这本质上是
if (freeptr < someaddr) {
*freeptr=ptr;
++freeptr;
}
else
{
freestuff();
freeptr = freeptrroot;
}
我确信这会非常快。我已经回答了我的问题。从未调用 GC 收集器的情况是它会更快,但是...我确信这不是文档的含义,因为它在测试中提到了两个收集器。我确信,如果 GC 收集器被调用一次,无论使用什么 GC,相同的应用程序都会变慢。如果知道它永远不需要免费,那么可以像我拥有的一个应用程序一样使用一个空的免费主体。
无论如何,我发布这个问题是为了进一步了解。
GC 如何比显式内存释放更快?
GC 可以将指针碰撞分配到线程局部生成中,然后依靠复制集合来处理(相对)不常见的撤离幸存者的情况。传统的分配器如malloc
经常争夺全局锁和搜索树。
GC 可以通过重置线程本地分配缓冲区而不是调用来同时释放许多死块free
依次在每个块上,即 O(1) 而不是 O(n)。
通过压缩旧块,使更多块适合每个缓存行。改进的局部性提高了缓存效率。
通过利用额外的静态信息,例如不可变类型。
通过利用额外的动态信息,例如通过写屏障记录的数据改变堆的拓扑。
通过使更有效的技术易于处理,例如通过消除无等待算法中手动内存管理的麻烦。
通过将释放推迟到更合适的时间或将其卸载到另一个核心。 (感谢安德鲁·希尔提出这个想法!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)