假设我们要创建许多字节数组类型的小对象。大小各不相同,但总是低于1024字节,比如780,256,953....如果我们始终只分配bytes[1024],并且只使用需要的空间,是否会随着时间的推移提高operatornew或GC效率?UPD:这是短暂的生命对象,为解析二进制协议(protocol)消息而创建。UPD:在这两种情况下,对象的数量是相同的,只是分配的大小发生了变化(随机vs.总是1024)。在C++中,由于碎片化和C++的新性能,这很重要。但是在C#中.... 最佳答案 Willitimproveoperatornewo
我们如何使用GC.KeepAlive()目的是什么?我使用套接字将文件从终端(Windows-CE)传输到服务器。传输所需时间为8分钟。5分钟后Windows-CE关闭(如果未按下触摸屏)如果我为此使用GC.KeepAlive(),这是否解决了我的问题? 最佳答案 您很少需要使用GC.KeepAlive-非常很少。例如,如果您想防止终结器的副作用过早发生,您可以使用它。我最常看到它用于Mutex-保持互斥直到应用程序结束,以确保只有一个实例。(using语句实际上在这里更好,但这是另一回事。)不,这听起来与您的情况无关。
我在CLRviaC#一书中阅读了有关GC的内容,特别是关于CLR何时开始收集的内容。我知道它必须在收集发生之前暂停线程,但它提到它必须在线程指令指针到达安全点时执行此操作。在它不在安全点的情况下,它会尝试快速到达一个安全点,它通过劫持线程(在线程堆栈中插入一个特殊的函数指针)来实现。这一切都很好,但我认为默认情况下托管线程是安全的?我最初认为它可能指的是非托管线程,但CLR允许非托管线程继续执行,因为任何正在使用的对象无论如何都应该被固定。那么,什么是托管线程中的安全点,GC如何确定那是什么?编辑:我认为我不够具体。根据thisMSDNarticle,即使调用了Thread.Suspe
让我们看看下面显示问题的片段。classProgram{staticvoidMain(string[]args){vartask=Start();Task.Run(()=>{Thread.Sleep(500);Console.WriteLine("StartingGC");GC.Collect();GC.WaitForPendingFinalizers();Console.WriteLine("GCDone");});task.Wait();Console.Read();}privatestaticasyncTaskStart(){Console.WriteLine("Start");
我有一个在VS2017中开发的.NETCore应用程序(MyApp.exe)运行在1.0.4版本上>SDK。我尝试添加一个包含以下条目的App.config:构建时重命名为:MyApp.config。但这并没有改变GC模式;有什么想法吗? 最佳答案 基于thissource,您可以通过csproj执行此操作:true 关于c#-如何在.NETCore中启用服务器GC?,我们在StackOverflow上找到一个类似的问题: https://stackoverf
出于某种原因FXCopseemstothink我应该在Dispose中调用GC.SuppressFinalize,无论我是否有终结器。我错过了什么吗?是否有理由在没有定义终结器的对象上调用GC.SuppressFinalize? 最佳答案 没有必要在Dispose中调用GC.SuppressFinalize(this),除非:您是实现用于重写的虚拟Dispose方法的基类(同样,即使在这里,这也可能不是您的责任,但在那种情况下您可能想要这样做)你自己有一个终结器。从技术上讲,.NET中的每个类都有一个终结器,但如果唯一存在的终结器是
在他的articleaboutpreventingmultipleinstancesMichaelCovington展示了一个应用程序的代码:staticvoidMain()//argsareOKhere,ofcourse{boolok;m=newSystem.Threading.Mutex(true,"YourNameHere",outok);if(!ok){MessageBox.Show("Anotherinstanceisalreadyrunning.");return;}Application.Run(newForm1());//orwhateverwasthereGC.Kee
.NET垃圾收集器收集对象(回收它们的内存)并执行内存压缩(以将内存碎片保持在最低限度)。我想知道,由于一个应用程序可能有很多对对象的引用,当对象的地址由于GC进行的压缩而发生变化时,GC(或CLR)如何管理这些对对象的引用。 最佳答案 这个概念很简单,垃圾收集器简单地更新任何对象引用并将它们重新指向移动的对象。实现有点棘手,native代码和托管代码之间没有真正的区别,它们都是机器代码。对象引用并没有什么特别之处,它只是运行时的一个指针。收集器需要一种可靠的方法来找回这些指针并将它们识别为引用托管对象的类型。不仅要在压缩过程中移动
我在MSDN和CLRviac#上读到了这个问题。假设我们有一个分配的2Mb非托管HBITMAP和一个指向它的8字节托管位图。如果它永远无法对对象做任何事情,那么用AddMemoryPressure告诉GC有什么意义,因为它被分配为非托管资源,因此不易受到垃圾收集的影响? 最佳答案 提供它是为了让GC在收集期间了解对象的真实成本。如果对象实际上大于管理大小反射(reflect)的大小,则它可能是快速(更)收集的候选对象。布拉德·艾布拉姆斯entry关于它很清楚:Consideraclassthathasaverysmallmanage
我正在对我的代码运行一些基准测试,我想确保在我的一个基准测试期间不会发生垃圾收集,因为它正在清理先前测试的困惑情况。我认为我最好的机会是在开始基准测试之前强制收集。所以我在基准测试开始之前调用GC.Collect()但不确定收集是否继续在单独的线程中运行,等等并立即返回。如果它确实在BG线程上运行,我想知道如何同步调用它或至少等到它完成收集。 最佳答案 如MSDN所述-使用此方法尝试回收所有不可访问的内存。无论如何,如果它确实开始了垃圾收集,您应该在开始基准测试之前等待所有终结器完成。GC.Collect();GC.WaitForP