首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我要求dotMemory强制垃圾收集时会发生什么?

当我要求dotMemory强制垃圾收集时会发生什么?
EN

Stack Overflow用户
提问于 2017-02-03 11:03:40
回答 1查看 1.1K关注 0票数 6

我使用dotMemory来分析我的应用程序,并注意到以下行为:在我的代码中,有一些地方我使用

代码语言:javascript
复制
GC.Collect();
GC.WaitForPendingFinalizers();

在dotMemory中,我看到内存实际上是在这些点中释放的,但如果在此之后单击“Force”,则会收集更多的内存。他们这样做的方式是什么,为什么我的代码没有收集内存,是否有可能达到相同的收集级别?

我附加了屏幕截图,你可以看到dotMemory几乎把第2代减少了一半

我还尝试执行多个集合,即

代码语言:javascript
复制
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();

尽管它似乎恢复了更多的内存,但它从来没有接近于dotMemory的性能。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-28 06:50:19

来自JetBrain论坛

“强制GC”按钮从本机代码调用GC。

当您从代码中调用GC.Collect()方法时,它将执行以下步骤:

释放可以立即释放的内存,找到具有Find方法的对象,并将它们放到一个队列中,GC.Collect()只释放托管对象。此外,CLR有几种不同的GC策略,根据不同的情况应用,以尽量减少导致GC的延迟,而我们不能影响它。如果托管对象使用的本机内存没有Finalize方法,或者该方法实现得不正确,这些内存将永远不会被释放。

我们可以建议您使用WaitForPendingFinalizers调用GC.Collect方法,并重复多次:

代码语言:javascript
复制
for (int i = 0; i < 4; i++)
{
    GC.Collect(2, GCCollectionMode.Forced, true);
    GC.WaitForPendingFinalizers();
}

它可以显示更好的结果,但我们不能保证这些代码将导致与本机代码调用的完整GC相同的结果。

GC.Collect方法:https://msdn.microsoft.com/en-us/library/hh138633(v=vs.110).aspx

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42022723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档