.net GC.GetTotalMemory(false)和GC.GetTotalMemory(true)之间的区别是什么

.net GC.GetTotalMemory(false)和GC.GetTotalMemory(true)之间的区别是什么,.net,.net,有人能告诉我GC.GetTotalMemory(false)和 GC.GetTotalMemory(真) 我有一个小程序,当我比较第一个循环的结果时 给出GC.GetTotalMemory的put(true); GC.GetTotalMemory的(false); 但这不应该是另一种方式吗 其余的循环笑眯眯地打印一些数字,这两种情况下都是不同的。这个数字表示什么?为什么它会随着循环的增加而变化 using System; using System.Collections.Generic; us

有人能告诉我GC.GetTotalMemory(false)和 GC.GetTotalMemory(真)

我有一个小程序,当我比较第一个循环的结果时 给出GC.GetTotalMemory的put(true); GC.GetTotalMemory的(false); 但这不应该是另一种方式吗

其余的循环笑眯眯地打印一些数字,这两种情况下都是不同的。这个数字表示什么?为什么它会随着循环的增加而变化

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace test
{   
   struct Address
   {
       public string Street;
   }
   class Details
   {
      public string Name ;
      public Address address = new Address();

   }
   class emp :IDisposable
   {
       public Details objb = new Details();       
       bool disposed = false;
       #region IDisposable Members
       public void Dispose()
       {
           Disposing(true);
       }
       void Disposing(bool disposing)
       {
           if (!disposed)
               disposed = disposing;
           objb = null;           
           GC.SuppressFinalize(this);
       }

       #endregion
   }


    class Program
    {       
        static void Main(string[] args)
        {        
           long size1 = GC.GetTotalMemory(false);
           emp empobj = null;          
           for (int i = 0; i < 200;i++ )
           {
              // using (empobj = new emp()) //------- (1)
               {
                   empobj = new emp(); //------- (2)
                   empobj.objb.Name = "ssssssssssssssssss";
                   empobj.objb.address.Street = "asdfasdfasdfasdf";
               }

              long size2 = GC.GetTotalMemory(false);             
              Console.WriteLine( "loop count " +i + "  Diff = " +(size2-size1));

           }
        }

    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统诊断;
名称空间测试
{   
结构地址
{
公众街;;
}
课程详情
{
公共字符串名称;
公共地址=新地址();
}
emp类:IDisposable
{
公共详细信息objb=新详细信息();
布尔=假;
#区域IDisposable成员
公共空间处置()
{
处置(真实);
}
无效处置(bool处置)
{
如果(!已处置)
处置=处置;
objb=null;
总干事(本);
}
#端区
}
班级计划
{       
静态void Main(字符串[]参数)
{        
long size1=GC.GetTotalMemory(false);
emp empobj=null;
对于(int i=0;i<200;i++)
{
//使用(empobj=new emp())/--(1)
{
empobj=新的emp();/-------(2)
empobj.objb.Name=“ssssss”;
empobj.objb.address.Street=“asdfasdfasdfasdf”;
}
long size2=GC.GetTotalMemory(false);
Console.WriteLine(“循环计数”+i+“差异=”+(size2-size1));
}
}
}
}

该参数定义在运行之前是否等待完全垃圾收集

见: 参数

强制收集
类型:System.Boolean
true表示此方法可以在返回之前等待垃圾回收;否则,错误


diff仍然为0的原因可能是因为即使传递false,GC也已经发生了。

在这两种情况下,
GC.GetTotalMemory()
是一个估计值,所以您真的不应该担心32字节的差异…

在这种情况下,当我传递true时,我希望得到diff=0,因为方法等待垃圾收集。但是当我传递false时,我得到了diff=0,这让我很困惑,只是在这里加上,如果在这里传递一个真值,那么会有显著的性能差异。我在一个循环中执行了一个检查,而true参数导致了显著的性能差异(我显然应该预料到这一点),为该参数传递一个false值是一个非常便宜的操作,并且在性能上与没有内存检查几乎没有任何差异。