当我要求dotMemory强制进行垃圾收集时会发生什么情况

德马施

我使用dotMemory来分析我的应用程序,并且注意到以下行为:在代码内,有些地方我使用手动执行垃圾收集

GC.Collect();
GC.WaitForPendingFinalizers();

在dotMemory内部,我发现这些点实际上已释放了内存,但是如果此后单击“ Force GC”,则会收集更多垃圾。他们这样做的方式是什么?为什么我的代码未收集该内存,并且实现相同级别的收集是可能的?

我附上了屏幕截图,您可以在其中看到第2代的dotMemory几乎减半在此处输入图片说明

我也尝试过执行多个收集,即

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();

即使它似乎回收了更多的内存,它也永远不会接近dotMemory的执行方式

艾尔阿西

JetBrain的论坛

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

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

释放可以立即释放的内存查找具有Finalize方法的对象,并将它们放入队列GC.Collect()仅释放托管对象。此外,CLR根据情况采用了几种不同的GC策略,以最大程度地减少造成GC的延迟,我们不会对此造成影响。如果这些对象没有Finalize方法或此方法实现不正确,则永远不会释放托管对象使用的本机内存。

我们建议您使用GC.Collect调用WaitForPendingFinalizers方法并将其重复几次:

for (int i = 0; i < 4; i++)
{
    GC.Collect(2, GCCollectionMode.Forced, true);
    GC.WaitForPendingFinalizers();
}

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当我在依赖jar的项目中进行更改时会发生什么情况?

当我从RAM运行持久性存储实时USB时会发生什么情况?

当我们使用json键作为JS代码时会发生什么情况?

当我在Zsh Shell中键入“ zsh -manual”时会发生什么情况?

当我们将jar提交给风暴集群时会发生什么情况?

当我在Clojure中从多个线程定义一个变量时会发生什么情况?

将用户定义的类型强制转换为char *时会发生什么情况?

VB.NET中的类型之间进行转换时会发生什么情况?

Web Worker类收集垃圾时会发生什么

当异步值被垃圾收集时会发生什么?

当我使用切片语法“ mylist [:] = [mylist,mylist,...]”将带有自我引用的列表分配给列表副本时会发生什么情况?

设置IIS池的LoadUserProfile时会发生什么情况?

在Haskell中用+编写*时会发生什么情况?

在Git中删除分支时会发生什么情况

将函数用作参数时会发生什么情况?

我执行apt-get升级时会发生什么情况?

当我在Amazon S3中将Quiet设置为true以便在deleteObjects()方法中启用安静模式时会发生什么情况?

当我在shell中执行文件时,会发生什么情况?

当我使用Ctrl + c终止Python脚本时,内部会发生什么情况?

当我归档记录时,相关字段会发生什么情况?

在这种情况下,当我增加边界权时会发生什么?

了解我使用Ctrl-v转储终端字符序列时会发生什么情况?

当我停止实例时,我的 EC2 实例数据 (EBS) 会发生什么情况?

当我在Scala中使用全局地图变量而不进行广播时会发生什么

当我尝试从管道中读取而不进行写入时会发生什么?

就system_read中断,汇编而言,当我按Enter按钮时,会发生什么情况?

当我们在C中将数字转换为较小的数字时,会发生什么情况?

当我分配大于字节的值时会发生什么?

当我调用“ BufferStrategy.show()”时会发生什么?