Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将对象固定在LOH中是否会影响GC性能?_.net_Garbage Collection - Fatal编程技术网

.net 将对象固定在LOH中是否会影响GC性能?

.net 将对象固定在LOH中是否会影响GC性能?,.net,garbage-collection,.net,Garbage Collection,我已经读到,在托管堆中固定对象会影响.NET中的GC性能,因为如果有固定对象“挡道”,GC无法压缩内存。但是,由于大型对象堆无论如何都不会被压缩,这不应该应用于LOH中的对象。在LOH中固定一个物体还有其他隐藏的成本吗?或者我可以在不降低GC性能的情况下安全地将对象固定在LOH中吗?嗯,仅仅因为大型对象堆(LOH)没有被压缩并不意味着它没有被收集。将一个对象固定在那里将对未来的分配产生影响 由于对象被固定,因此它会有效地收缩LOH中可用的内存量(就像您持有引用一样)。当发出另一个分配大型对象的请

我已经读到,在托管堆中固定对象会影响.NET中的GC性能,因为如果有固定对象“挡道”,GC无法压缩内存。但是,由于大型对象堆无论如何都不会被压缩,这不应该应用于LOH中的对象。在LOH中固定一个物体还有其他隐藏的成本吗?或者我可以在不降低GC性能的情况下安全地将对象固定在LOH中吗?

嗯,仅仅因为大型对象堆(LOH)没有被压缩并不意味着它没有被收集。将一个对象固定在那里将对未来的分配产生影响

由于对象被固定,因此它会有效地收缩LOH中可用的内存量(就像您持有引用一样)。当发出另一个分配大型对象的请求时,如果LOH中有太多固定/保留的引用,则可能会遇到分配更多大型对象的问题

当在垃圾收集的标记和清除部分进行标记时,CLR可能会将所有固定为根的引用标记为根,因此在垃圾收集的这一部分中可能没有影响;如果有人保留对大对象的引用,其行为也会相同

由于LOH上的释放方式相同(该块被简单地标记为可用),因此该操作也不会受到影响

最后,由于LOH没有被压缩,所以在GC期间,这个操作永远不会在这个堆上发生,所以这里不受影响

总之,LOH上的分配肯定会受到LOH上对象的固定引用的影响,而LOH上的集合很可能不会受到影响


尽管我们不要忘记,分配和保存大块内存通常会对系统产生影响,但这些评论完全是关于LOH的。

谢谢您的回答。我不确定我是否理解了第二段:为什么钉住比保留引用更能收缩可用内存?我一直认为,在LOH上分配某些内容实际上意味着寻找一个足够大的空闲内存块或分配一个新的段-如果是这样,任何活动块都应该被视为相同的,固定或不固定。@nikie:它不再这样做了,它只是具有相同的效果(如您所述)。我已经相应地更新了我的答案。这是一个很小但意义重大的变化。