Tag: garbage collection

具有IDisposable且没有IDisposable的内存释放

在我的应用程序中,我有一个大的对象,每隔几秒就创建一次,我做了一些工作然后我不再需要它了。 我在任务管理器中看到,即使我没有对象的ant引用,ram大小也会上升,并且需要收集它。 我试图实现IDisposable,然后ram不断下降。 为什么是这样? 我不做GC.Collect我只是释放对象并告诉GC他不需要为我的对象调用终结器? 更新 这是我在IDIsposable对象中使用的代码: public void Dispose() { base.Dispose(); Dispoe(true); GC.SuppressFinalize(); } private void Dispoe(bool disposing) { //here i release unmanaged resources if (disposing) { //here i release all managed resources } } ~MyObject() { Dispose(false); } 在我的大对象中,我做了myObject.Dispose(); 在我不再需要他之后。 我的问题不是关于如何实现IDisposable,而是关于GC代的工作。 我只是想知道如何可能的情况之间的公羊大小差异的情况我做Dispoe我的对象情况我不会Dispoe我的对象。

C#垃圾收集

说我们有: public void foo() { someRefType test = new someRefType (); test = new someRefType (); } 垃圾收集器对第一个堆对象做了什么? 是否在新任务之前立即收集垃圾? 一般机制是什么? 谢谢,Juergen

第3代对象与大对象堆之间的区别

大对象堆和GC第3代对象有什么区别?

垃圾收集运行得太晚 – 导致OutOfMemoryexception

想知道是否有人可以对此有所了解。 我有一个具有大内存占用(和内存流失)的应用程序。 没有任何内存泄漏,GC往往可以很好地释放资源。 但是,偶尔GC不会“按时”发生,导致内存不足exception。 我想知道是否有人可以对此有所了解? 我已经使用了REDGate分析器,这非常好 – 应用程序具有典型的“锯齿”模式 – OOM发生在锯齿的顶部。 遗憾的是,无法使用分析器(AFAIK)来识别内存流失源。 是否可以设置内存“软限制”,应该强制使用GC? 目前,GC只在内存处于绝对限制时执行,从而产生OOM。

GCHandleType.Pinned与使用“fixed”关键字类似吗?

我正在尝试使用“安全”代码中的IntPtr,将其与“不安全”模式下的操作进行比较。 GCHandleType.Pinned类似于在不安全模式下使用“fixed”吗? GCHandle pinnedArray = GCHandle.Alloc(byteArray, GCHandleType.Pinned); IntPtr pointer = pinnedArray.AddrOfPinnedObject(); //do your stuff pinnedArray.Free(); VS byte[] buffer = new byte[255]; fixed (byte* p = buffer) { IntPtr ptr = (IntPtr)p; // do you stuff here }

需要击败GC并且一旦超出范围就将对象销毁

我需要使用Mutex保护几段代码。 问题是代码看起来像这样: lock(mylockobject) { if(!foo()) throw new MyException(“foo failed”); if(!bar()) throw new MyException(“bar failed”); } 使用锁,它可以按照我的意愿工作,但现在我需要使用互斥锁。 这里显而易见的问题是,如果我获取互斥锁并且foo()或bar()失败,我将不得不在抛出每个exception之前释放互斥锁。 在C ++中,我将利用在堆栈上创建的对象的范围,并将互斥锁定在对象的构造函数中,然后在析构函数中释放它。 使用.NET的垃圾收集,我认为这不会起作用。 我写了一个测试应用程序,并确认如果我做这样的事情: public class AutoMutex { private Mutex _mutex; public AutoMutex(Mutex mutex) { _mutex = mutex; _mutex.WaitOne(); } ~AutoMutex() { _mutex.ReleaseMutex(); } } 然后有这样的代码: // some code here… Mutex my_mutex = new Mutex(false, “MyMutex”); { // […]

固定.NET对象数组

我想固定.NET对象(包括对象)的数组,以允许本机函数对对象进行一些处理。 据我所知,GCHandle.Alloc()不允许我这样做,因为这样的数组包含引用(并且对象也可能包含引用),这些引用不是blittable。 有没有其他选择来实现这一目标? 对于非常黑客的建议或需要Mono的建议我会没事的。

在每天24小时运行的应用程序上使用GC.Collect是否明智?

我们的应用程序每天24小时运行,每周运行7天。 有时CPU达到100%然后回到80%。 与RAM相同。 几个小时后手动调用GC.Collect或者自动离开它是否很聪明。 我们正在使用C#2010,SQL 2008和Fluent Nhiberanet。 这是桌面应用程序。

符合条件的C#编译器是否可以优化本地(但未使用)变量(如果它是对象的唯一强引用)?

另请参阅以下相关资源: .NET垃圾收集器是否执行代码的预测分析? (在Stack Overflow上) WP7:GC何时将局部变量视为垃圾 (MSDN上的博客文章) 换一种说法: 可以在变量超出范围之前回收局部变量引用的对象(例如,因为变量已分配,但之后不再使用),或者该变量在变量退出之前保证不符合垃圾收集条件。范围? 让我解释: void Case_1() { var weakRef = new WeakReference(new object()); GC.Collect(); // <– doesn't have to be an explicit call; just assume that // garbage collection would occur at this point. if (weakRef.IsAlive) … } 在这个代码示例中,我显然必须计划垃圾收集器回收新object的可能性; 因此if语句。 (请注意,我使用weakRef的唯一目的是检查新object是否仍然存在。) void Case_2() { var unusedLocalVar = new object(); var […]

.NET 4.5:.NET运行时内部错误(80131506)/禁用并发GC

我有一个长期运行的.NET 4.5应用程序随机崩溃,留下我在事件日志中的问题标题中提到的消息。 该问题在3个不同的机器和2个不同的系统(2008 R2和2012)上重现。 应用程序不使用任何不安全/非托管组件,它是纯托管.NET,唯一不受管理的东西是CLR本身。 这是我从转储中提取的崩溃站点的堆栈跟踪: clr.dll!MethodTable::GetCanonicalMethodTable() clr.dll!SVR::CFinalize::ScanForFinalization() – 0x1a31b bytes clr.dll!SVR::gc_heap::mark_phase() + 0x328 bytes clr.dll!SVR::gc_heap::gc1() + 0x95 bytes clr.dll!SVR::gc_heap::garbage_collect() + 0x16e bytes clr.dll!SVR::gc_heap::gc_thread_function() + 0x3e bytes clr.dll!SVR::gc_heap::gc_thread_stub() + 0x77 bytes kernel32.dll!BaseThreadInitThunk() + 0x1a bytes ntdll.dll!RtlUserThreadStart() + 0x21 bytes 这个问题与这里讨论的问题非常相似,所以我尝试了该主题中提出的解决方案,但没有一个帮助: 我已经尝试安装此修补程序,但它不会安装在我的任何机器上(KB2640103不适用,或被计算机上的其他条件阻止),这实际上是有道理的,因为我使用的是4.5,而不是4.0 。 我已经尝试禁用并发GC和/或启用服务器GC。 现在我的app.config的相关部分如下所示: 虽然奇怪的是我仍然在进程转储中找到多个与GC相关的线程。 除了发生崩溃之外,还有7个线程具有以下堆栈跟踪: ntdll.dll!NtWaitForSingleObject() + 0xa bytes KERNELBASE.dll!WaitForSingleObjectEx() + 0x9a bytes clr.dll!CLREventBase::WaitEx() […]