Shi*_*rod 12 .net garbage-collection
我正在为我的公司写一篇论文,关于如何避免直接从代码中调用垃圾收集器(例如,当玩COM对象时).
我知道这是一个不好的做法,应该只在非常罕见的情况下考虑,但我似乎无法找到解释为什么应该避免的方法.而且我不想依赖"GC比你更聪明"的原则(即使它是真相:-))
那么你能告诉我为什么你认为应该避免直接调用垃圾收集器的一些线索吗?(性能影响?)或者如果你有关于这个特定主题的链接,他们会非常有帮助.
提前致谢 !
编辑:你提供的所有aswers真的很有帮助.因为我无法验证每个人(或者我可以吗?),我该怎么办?制作社区维基?
通常的性能论点是这样的:
分代 GC 速度很快,因为它们依赖于许多分配的对象都是短暂的启发式(对象只要可访问,就处于“活动”状态;GC 的重点是检测“死亡”对象并回收其内存)。这意味着对象可以积累在一个特殊的区域(“年轻一代”);当该区域已满时,GC 就会运行,并清除活动对象,将它们(“物理上”)移动到老年代。在大多数分代 GC 中,此操作意味着暂停(“stop-the-world”),这是可以容忍的,因为它很短(年轻代的大小有限)。事实上,在年轻代的收集期间,世界会暂停,从而可以有效地处理年轻对象(即,在年轻对象字段中读取或写入引用只是一次内存访问,无需考虑 GC 线程的并发访问)或增量标记和扫描)。
年轻一代,按照我上面描述的方式运行收集,是高效的,因为当年轻一代被收集时,其中的大多数对象已经死亡,因此它们不会产生额外的成本。年轻代的最佳大小是最坏情况(所有年轻对象都存活,这意味着最大暂停时间)和平均效率(当年轻代较大时,更多对象有时间在死亡之前死亡)之间的权衡。收集,从而降低 GC 的平均成本)。
手动运行GC类似于缩短年轻代。这意味着更多的年轻对象将被晋升到老年代,从而增加了年轻代的收集成本(必须清除更多的对象)和老年代的收集成本(需要处理更多的旧对象)。
| 归档时间: |
|
| 查看次数: |
357 次 |
| 最近记录: |