jjzjj

gc-sections

全部标签

c# - GC 行为和 CLR 线程劫持

我在CLRviaC#一书中阅读了有关GC的内容,特别是关于CLR何时开始收集的内容。我知道它必须在收集发生之前暂停线程,但它提到它必须在线程指令指针到达安全点时执行此操作。在它不在安全点的情况下,它会尝试快速到达一个安全点,它通过劫持线程(在线程堆栈中插入一个特殊的函数指针)来实现。这一切都很好,但我认为默认情况下托管线程是安全的?我最初认为它可能指的是非托管线程,但CLR允许非托管线程继续执行,因为任何正在使用的对象无论如何都应该被固定。那么,什么是托管线程中的安全点,GC如何确定那是什么?编辑:我认为我不够具体。根据thisMSDNarticle,即使调用了Thread.Suspe

c# - 为什么 GC 在我引用它时收集我的对象?

让我们看看下面显示问题的片段。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");

c# - 如何在 .NET Core 中启用服务器 GC?

我有一个在VS2017中开发的.NETCore应用程序(MyApp.exe)运行在1.0.4版本上>SDK。我尝试添加一个包含以下条目的App.config:构建时重命名为:MyApp.config。但这并没有改变GC模式;有什么想法吗? 最佳答案 基于thissource,您可以通过csproj执行此操作:true 关于c#-如何在.NETCore中启用服务器GC?,我们在StackOverflow上找到一个类似的问题: https://stackoverf

c# - 应该在没有终结器的对象上调用 GC.SuppressFinalize 吗?

出于某种原因FXCopseemstothink我应该在Dispose中调用GC.SuppressFinalize,无论我是否有终结器。我错过了什么吗?是否有理由在没有定义终结器的对象上调用GC.SuppressFinalize? 最佳答案 没有必要在Dispose中调用GC.SuppressFinalize(this),除非:您是实现用于重写的虚拟Dispose方法的基类(同样,即使在这里,这也可能不是您的责任,但在那种情况下您可能想要这样做)你自己有一个终结器。从技术上讲,.NET中的每个类都有一个终结器,但如果唯一存在的终结器是

c# - GC.KeepAlive 与使用

在他的articleaboutpreventingmultipleinstancesMichaelCovington展示了一个应用程序的代码:staticvoidMain()//argsareOKhere,ofcourse{boolok;m=newSystem.Threading.Mutex(true,"YourNameHere",outok);if(!ok){MessageBox.Show("Anotherinstanceisalreadyrunning.");return;}Application.Run(newForm1());//orwhateverwasthereGC.Kee

c# - 发生压缩后GC如何更新引用

.NET垃圾收集器收集对象(回收它们的内存)并执行内存压缩(以将内存碎片保持在最低限度)。我想知道,由于一个应用程序可能有很多对对象的引用,当对象的地址由于GC进行的压缩而发生变化时,GC(或CLR)如何管理这些对对象的引用。 最佳答案 这个概念很简单,垃圾收集器简单地更新任何对象引用并将它们重新指向移动的对象。实现有点棘手,native代码和托管代码之间没有真正的区别,它们都是机器代码。对象引用并没有什么特别之处,它只是运行时的一个指针。收集器需要一种可靠的方法来找回这些指针并将它们识别为引用托管对象的类型。不仅要在压缩过程中移动

c# - 将 GC.AddMemoryPressure 与非托管资源一起使用有什么意义?

我在MSDN和CLRviac#上读到了这个问题。假设我们有一个分配的2Mb非托管HBITMAP和一个指向它的8字节托管位图。如果它永远无法对对象做任何事情,那么用AddMemoryPressure告诉GC有什么意义,因为它被分配为非托管资源,因此不易受到垃圾收集的影响? 最佳答案 提供它是为了让GC在收集期间了解对象的真实成本。如果对象实际上大于管理大小反射(reflect)的大小,则它可能是快速(更)收集的候选对象。布拉德·艾布拉姆斯entry关于它很清楚:Consideraclassthathasaverysmallmanage

c# - GC.Collect() 阻塞了吗?

我正在对我的代码运行一些基准测试,我想确保在我的一个基准测试期间不会发生垃圾收集,因为它正在清理先前测试的困惑情况。我认为我最好的机会是在开始基准测试之前强制收集。所以我在基准测试开始之前调用GC.Collect()但不确定收集是否继续在单独的线程中运行,等等并立即返回。如果它确实在BG线程上运行,我想知道如何同步调用它或至少等到它完成收集。 最佳答案 如MSDN所述-使用此方法尝试回收所有不可访问的内存。无论如何,如果它确实开始了垃圾收集,您应该在开始基准测试之前等待所有终结器完成。GC.Collect();GC.WaitForP

c# - 为什么 GC System.Threading.OverlappedData 需要这么长时间?

我正在通过内存分析器运行我的应用程序以检查是否有泄漏。事情似乎有点好,但我得到了很多这些OverlappedData,它们似乎在终结器队列中徘徊,几乎什么都不做。它们是重叠IO的结果,已通过关闭连接两端的底层NetworkStream取消。网络流本身被释放。任何地方都没有NetworkStream的实时实例。通常,它们Root于称为OverlappedDataCacheLine的东西。我做的第一件事就是在回调中调用EndRead,所以没有调用BeginRead应该没有相应的EndRead。这是一个非常典型的外观,表明谁将它从工具中取出最后它确实得到了GC,但它需要永远-当我开始大约一千

c# - 委托(delegate)会导致内存泄漏吗? GC.TotalMemory(true) 似乎表明如此

代码usingSystem;internalstaticclassTest{privatestaticvoidMain(){try{Console.WriteLine("{0,10}:Startpoint",GC.GetTotalMemory(true));ActionsimpleDelegate=SimpleDelegate;Console.WriteLine("{0,10}:Simpledelegatecreated",GC.GetTotalMemory(true));ActionsimpleCombinedDelegate=simpleDelegate+simpleDelegat