草庐IT

垃圾包

全部标签

c# - 抑制 C# 垃圾回收

我的应用程序分配了大量内存(数百万个小对象,总计几千兆字节)并保留了很长时间。.NET是否在浪费时间检查所有这些数据以对其进行GC?第2代GC(检查所有对象)多久发生一次?有什么方法可以降低它的频率或暂时抑制它的发生吗?我确切地知道什么时候我准备好收集大量内存,有什么方法可以优化它吗?我目前正在调用GC.Collect();GC.WaitForPendingFinalizers();那时。更新:性能计数器“GC时间百分比”显示平均为10.6%。 最佳答案 除非您可以确认垃圾收集器正在主动降低应用程序的性能,否则您不应采取措施削弱运行

c# - Expression<TDelegate>.Compile 和垃圾收集

当我将表达式编译成可执行代码并获取委托(delegate)时-如果不再存在对该委托(delegate)的引用,代码是否会被垃圾收集?有这方面的文档吗?因为我在MSDN中没有找到任何有用的东西。 最佳答案 是的,代码可以被垃圾回收。当您对T的表达式调用编译时,代码将编译为DynamicMethod,并且那些有资格进行垃圾收集。确实在MSDN上没有说明,但您可以查看DLR中Expression.Compile的实现,这是.net4.0附带的内容:http://dlr.codeplex.com/SourceControl/changese

c# - 在 visual studio 中调用垃圾收集

是否可以通过VisualStudio2015Enterprise在调试session期间收集gc?我想在调用GC.Collect()时观察我的应用程序的内存使用情况,但仅用于一些调试。因此,在调试应用程序期间从VisualStudio调用它会非常有帮助。非常感谢! 最佳答案 您可以在立即窗口中编写GC.Collect()。 关于c#-在visualstudio中调用垃圾收集,我们在StackOverflow上找到一个类似的问题: https://stackov

c# - 在静态类中声明的对象何时会被垃圾回收?

publicstaticclassstClass{staticClass1obj=newClass1();publicstaticintreturnSomething(){return0;}}如果我正在调用静态函数stClass.returnSomething()在其他一些非静态类中?注意:Class1不是静态的 最佳答案 从不,如obj不执行IDisposable.如果你的意思是什么时候obj获得垃圾收集那么答案仍然是永远不会-静态字段永远不会被垃圾收集,因此obj的对象如果您设置obj,引用将仅符合垃圾收集条件为空(或其他一些对

c# - .NET:典型的垃圾收集器开销是多少?

5%的执行时间花在了GC上?10%?25%?谢谢。 最佳答案 Thisblogpost对该领域进行了有趣的调查。海报的结论?对于他的示例,开销可以忽略不计。SotheGCheapissofastthatinarealprogram,evenintightloops,youcanuseclosuresanddelegateswithoutevengivingitasecond’sthought(orevenafewnanosecond’sthought).Asalways,workonaclean,safedesign,thenpro

c# - 是否可以停止 .NET 垃圾收集?

程序员是否可以在C#编程语言中以编程方式启动/停止垃圾回收?比如为了性能优化等等。 最佳答案 从.NET4.6开始,在GCclass中有方法是可能的:GC.TryStartNoGCRegion(...)和GC.EndNoGCRegion()。 关于c#-是否可以停止.NET垃圾收集?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/3074434/

c# - 为什么我们需要在某些对象上使用 Dispose() 方法?为什么垃圾收集器不做这项工作?

问题是:为什么我们需要在某些对象上调用Dispose()?为什么垃圾收集器在超出范围时不收集对象?我试图理解为什么它是这样实现的。我的意思是,如果在垃圾收集器收集超出范围的对象时调用Dispose()会不会更容易。 最佳答案 垃圾收集器是不确定的-它会在对象不再被引用后某个时间点收集对象,但不能保证及时发生。与引用计数相比,这有很多好处,包括允许循环依赖和不在所有地方递增和递减计数器的性能优势。但是,这确实意味着对于应该及时清理的资源(例如数据库连接、文件句柄等-几乎所有内存以外的资源),您仍然需要显式处理资源。using语句使这变

C# - 垃圾回收

好的,我了解了栈和堆(值存在于栈中,引用存在于堆中)。当我声明一个类的新实例时,它位于堆上,并在堆栈上引用内存中的这一点。我也知道C#有它自己的垃圾收集器(即它确定实例化类何时不再使用并回收内存)。我有两个问题:我对垃圾收集的理解是否正确?我可以自己做吗?如果是的话,我自己这样做有什么真正的好处,还是我应该放弃它。我问是因为我在For循环中有一个方法。每次我经历一个循环时,我都会创建我的类的一个新实例。在我的脑海中,我想象所有这些类都堆成一堆,除了占用内存之外什么都不做,我想尽快摆脱它们以保持整洁!我理解正确还是我遗漏了什么? 最佳答案

c# - 在 Mono 中触发垃圾回收

如何让Mono中的垃圾收集器做任何有用的事情?这篇文章的底部是一个生成两个大字符串的简单C#测试程序。生成第一个字符串后,取消引用变量,退出作用域,并手动触发垃圾收集器。尽管如此,使用的内存并没有减少,并且在构造第二个字符串期间程序因内存不足异常而爆炸。UnhandledException:OutOfMemoryException[ERROR]FATALUNHANDLEDEXCEPTION:System.OutOfMemoryException:Outofmemoryat(wrappermanaged-to-native)string:InternalAllocateStr(int)a

c# - 垃圾回收是如何收集自引用对象的?

如果某个对象未被任何其他对象引用,则它会被.NETCLR垃圾收集器收集。但是,如果objA引用objB,objB引用objC,而objC对objA的引用,垃圾收集器如何确定它们(作为一个整体)可以被收集? 最佳答案 CLR使用一种称为标记清除的技术。作为这项技术的一部分,每个对象都可以被认为是最初标记为收集的。然后,CLR遍历每个可访问对象,从您的全局变量(静态字段等)作为根开始,并清除每个可遍历对象上的标记。然后它会扫除剩余的标记对象。请记住,此“标记”是概念性的;实际上,对象很可能被添加到一个集合集中。在循环自引用对象的情况下,