草庐IT

rb_gc_mark

全部标签

c# - 第三方库中麻烦的 GC.collect() 调用

在分析我的应用程序(C#、.NET4)时,我注意到我正在使用的第三方库显式调用了GC.Collect()。这非常烦人,因为它有时会对我的应用程序性能产生巨大影响,因为对该库的一些调用最终会陷入巨大的循环:花在GC.Collect上的时间占总执行时间的80%以上。当然,我向库维护者报告了这种行为(库不是开源的),但是当他们正在开发新版本时,我想优化我的应用程序。我能做什么?我尝试通过将GCSettings.LatencyMode设置为GCLatencyMode.LowLatency来配置GC(当然,仅在执行库调用期间),但无济于事。我宁愿避免fork我的过程。有什么想法吗?

c# - GC generation 3 出现在 windbg 中

我有一个正在运行的进程的转储文件(试图查找内存泄漏)我注意到的一件事是,当我通过!do转储更大的对象时,windbg告诉我它们是第3代GC??所有这些都是字节数组,所以当我查看转储中的所有字节数组时,我可以看到第0、1、2和3代GC。谁能解释一下这里发生了什么,因为我认为只有3代GC。>0:000>!do0x0000000011b47450Name:System.Byte[]MethodTable:000007fef7d2e798EEClass:000007fef7932670Size:131096(0x20018)bytesGCGeneration:3Array:Rank1,Numb

c# - 为什么 GC 在 LINQ 查询后释放 WhereListIterator 而不是表示条件的函数?

我正在查看一个简单的LINQ查询对内存的影响,并注意到LINQ查询创建了2个类型为Enumerable+WhereListIterator的额外对象。和Func.使用的代码是这样的:staticvoidMain(string[]args){//Settingbaselinesnapshotvarlist1=newList{4862,6541,7841};varlist2=newList(list1.Count);varlist3=newList(list1.Count);//Firstsnapshot:LINQusagelist2.AddRange(list1.Where(item=>

c# - 调试器可视化工具和 "Type is not marked as serializable"

我正在尝试创建一个调试器可视化工具,它会显示任何Control的控件层次结构。它已完成,但我收到异常“类型未标记为可序列化”。我该如何克服呢?控件是.NETWindows窗体框架类型,我无法将其标记为可序列化。 最佳答案 您还需要实现VisualizerObjectSource执行自定义序列化。例子:publicclassControlVisualizerObjectSource:VisualizerObjectSource{publicoverridevoidGetData(objecttarget,StreamoutgoingD

c# - 为什么 GC 会将对象放入终结队列?

据我所知,一旦我实现了类的析构函数,C#中的垃圾收集器就会将类的所有对象放入终结队列。当我阅读GC.Suppresfinalize的文档时,它提到对象header已经为调用finalize设置了位。我想知道为什么GC的实现者必须将所有对象放入队列中,并将内存释放延迟1-2个周期。难道他们释放内存的时候就看一下位标志,然后调用对象的finalize,然后释放内存吗?毫无疑问,我是个白痴,我无法理解GC的工作原理。我提出这个问题只是为了提高我的理解或填补我知识上的空白编辑:如果位标志用于suppressfinalize,GC实现者可以为此目的在对象header中添加另一个标志,不是吗?

c# - ValueTypes 会导致 GC 吗?

如果我有堆栈分配的值类型,如何清理它们?GC只是堆对吗? 最佳答案 如果值在堆栈上,那么当当前堆栈帧被“弹出”(通过返回的方法)时,值被有效地清理...不会有任何终结器调用或类似的东西,但是下次堆栈达到那么高时,这些值使用的内存将被重新使用。请注意,值类型并不总是分配在堆栈上。特别是,它们通常作为其他对象的一部分进行分配(例如,具有int成员的类)或者它们可以装箱。 关于c#-ValueTypes会导致GC吗?,我们在StackOverflow上找到一个类似的问题:

c# - 此处是否需要 GC.KeepAlive,或者我可以依靠局部变量和参数来保持对象的事件状态吗?

我有很多方法采用WPF的WriteableBitmap并使用不安全的代码直接从其BackBuffer中读取。每当我做这样的事情时,我是否应该使用GC.KeepAlive并不完全清楚:intMyMethod(WriteableBitmapbmp){returnDoUnsafeWork(bmp.BackBuffer);}一方面,在MyMethod的堆栈上仍然有对bmp的引用。另一方面,它似乎依赖于实现细节-这可能会编译为尾调用,例如,在输入DoUnsafeWork时不保留对bmp的引用。类似地,想象以下假设代码:intMyMethod(){WriteableBitmapbmp1=getAB

c# - IDisposable GC.SuppressFinalize(this) 位置

我为我的代码使用默认的IDisposable实现模板(模式)。片段:publicvoidDispose(){Dispose(true);GC.SuppressFinalize(this);}protectedvirtualvoidDispose(boolisDisposing){if(!this.disposed){if(isDisposing){//cleanupmanagedresources}//cleanupunmanagedresourcesthis.disposed=true;}}我的问题:为什么在Dispose公共(public)方法中调用“GC.SuppressFina

c# - CA2104 警告 : Is there any way to mark a class as `Immutable` to suppress it?

考虑下面的代码,它触发了CA2104:Donotdeclarereadonlymutablereferencetypes.publicclassTest{//ThisprovokesCA2104:"Donotdeclarereadonlymutablereferencetypes".protectedreadonlyImmutableClassImmutableMember;}publicclassImmutableClass{}有谁知道以一种可以抑制警告CA2104的方式将类标记为不可变的方法吗?我尝试用[ImmutableObject(true)]装饰MutableClass没有成

C# GC.Collect 如果对象是使用实例构造函数初始值设定项构造的,则不会销毁该对象

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:ResurrectiondifferenceinusingObjectInitializer我很难理解垃圾收集器在C#中的工作原理(我使用的是2012,所以是c#4.5)。这是我的示例代码:publicclassA{publicintc;publicA(){}publicA(intpC){c=pC;}}publicstaticvoidMain(){//Test1vara=newA{c=199};varaRef=newWeakReference(a);a=null;Console.WriteLine(aRef.I