为了账号安全,请及时绑定邮箱和手机立即绑定

强制C#中垃圾收集的最佳实践

强制C#中垃圾收集的最佳实践

MM们 2019-07-06 16:19:38
强制C#中垃圾收集的最佳实践根据我的经验,大多数人都会告诉您,强制进行垃圾收集是不明智的,但是在某些情况下,您正在处理的大型对象并不总是在0代中被收集,但是在内存是问题的地方,强制收集可以吗?有没有这样做的最佳做法?
查看完整描述

3 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

在大多数情况下,最好的做法是不强制垃圾收集。(我研究过的每一个系统都强制垃圾收集,有一些突出的问题,如果解决了这些问题,就会消除强制垃圾收集的需要,并且大大加快了系统的速度。)

有一个少数案件什么时候你,你们比垃圾收集器更了解内存使用情况。在多用户应用程序或一次响应多个请求的服务中,这不太可能是正确的。

然而,在一些批式处理你知道的比GC更多。例如,考虑一个应用程序。

  • 给出命令行上的文件名列表。
  • 处理单个文件,然后将结果写入结果文件。
  • 在处理文件时,创建许多相互链接的对象,在文件处理完成之前无法收集这些对象(例如,解析树)。
  • 在已处理的文件之间保持不多状态。.

你,你们可以,可能能够(经过仔细的)测试,在处理每个文件之后强制进行一个完整的垃圾收集。

另一种情况是每隔几分钟唤醒一次处理某些项目的服务,并且不会在睡觉的时候保持任何状态..然后在睡觉前强迫一个完整的集合可以,可能值得。

当我知道最近创建了很多对象,并且当前引用的对象很少时,我才会考虑强制收集。

我宁愿有一个垃圾收集API,当我可以给它关于这类事情的提示时,而不必强迫GC自己。

亦见“里科·马里亚尼的表演奇闻"


查看完整回答
反对 回复 2019-07-06
?
繁花如伊

TA贡献2012条经验 获得超12个赞

从这个角度来看-当垃圾桶在10%的时候扔掉厨房的垃圾,还是在把它倒出来之前让它装满,这是更有效的方法吗?

不让它填满,你就是在浪费你的时间从外面的垃圾桶走来走去。这类似于GC线程运行时发生的情况-所有托管线程在运行时都挂起。如果我没有弄错,GC线程可以在多个AppDomain之间共享,因此垃圾收集会影响所有这些应用程序。

当然,你可能会遇到这样的情况:你不会很快在垃圾桶里添加任何东西-比如说,如果你要去度假的话。那么,在出去之前把垃圾扔出去是个好主意。

这可能是迫使GC能够提供帮助的一次-如果程序闲置,使用中的内存不会被垃圾收集,因为没有分配。


查看完整回答
反对 回复 2019-07-06
  • 3 回答
  • 0 关注
  • 498 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信