Tag: garbage collection

Ninject垃圾收集

我在一个由服务,存储库组成的n层应用程序中使用Ninject,所有这些都与UnitOfWork模式和Ninject相连。 此外,我在引用这些服务和存储库的单独线程中执行不同的作业。 每隔一段时间,似乎在随机的时间,我得到一个exception,它崩溃我的控制台应用程序执行作业。 例外是: Application: Playground.exe Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: System.NullReferenceException Stack: at Ninject.Activation.Caching.GarbageCollectionCachePruner.PruneCacheIfGarbageCollectorHasRun(System.Object) at System.Threading.ExecutionContext.runTryCode(System.Object) at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object) at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) at System.Threading._TimerCallback.PerformTimerCallback(System.Object) 据我所知,这与Ninject中新的Cache-and-Collection管理有关。 但是,我没有为任何Ninject绑定指定任何范围。 编辑:代码示例: 以下是一些使用的代码(我相信关键部分): public class DefaultUnitOfWork : Provider, IUnitOfWork, IServiceUnitOfWork where TObjectContext : ObjectContext, new() { […]

GCHandle固定内存/对象多少会使垃圾收集器变慢?

我确信这个答案取决于用户机器,但必须有一些固定数据的最佳实践 。 我需要保存5个字节数组,每个字节包含1.048.576字节。 通常我更喜欢使用GCHandle (托管)内存,但有些人说它会降低GC的速度。 我知道可能会发生这种情况,但需要固定多少内存/对象才能真正影响GC? 以下是我的选择: GCHandle.Alloc GCHandleType.Pinned (托管)。 它会减慢GC ?? Marshal.AllocHGlobal (非管理访问)。 不安全的代码 使用Bitmap在Scan0中保存数据(非托管访问)。 不安全的代码

C#禁用SslStream缓冲区缓存

我正在编写一个Web抓取应用程序,它使用代理为各种网站创建了大量并发HttpRequests。 大多数这些网站都启用了SSL。 我的应用程序使用了大量奇怪的内存,所以我决定调查并发现GC没有收集SslStream PinnableBufferCache 。 我在HttpRequest上禁用了ReadStreamBuffering和WriteStreamBuffering ,将HttpRequestCachePolicy设置为NoCacheNoStore并将KeepAlive设置为false ,但问题仍然存在,并且GC没有收集底层的SslStream缓存。 我无法发布我的代码示例,因为它的核心很大,并发模型提供代理和任务管理器,它控制发出请求的并发抓取线程。 但是我提供了.NET内存分析器的屏幕截图,它解释了我的问题

存储库上的Ninject WCF垃圾收集

我正在使用带有WCF扩展的Ninject 2.2。 在我的大多数服务中,存储库都会快速实例化/释放。 但是,我的一项服务执行长时间运行(2-3分钟)。 如果我观察w3wp进程,我可以看到使用SQL建立的TCP / IP连接,我可以在SQL上运行sp_who2并查看连接。 完成这些操作后,连接将保持打开状态5-10分钟。 当我多次运行该操作时,我没有看到生成新的连接,但是我将运行该应用程序的多个实例,并且我发现之前的性能下降,同时发送了那些长时间运行的操作,并且在几分钟后自行修复。 这个垃圾收集可以成为问题的一部分吗?如何解决? 这是我的Ninject绑定: Bind().To().InRequestScope(); 这是我的WCF绑定: 我意识到一个选择是将服务使用的存储库数量减少到一个,但我真的在寻找一个临时解决方案。

多次调用SuppressFinalize

是否有多次调用GC.SuppressFinalize(object)缺点? 处置模式的受保护的Dispose(bool)方法检查之前是否调用它,但是在公共Dispose()方法中没有这样的检查。 public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (_Disposed) return; if (disposing) { // Cleanup managed resources. } // Cleanup unmanaged resources. _Disposed = true; } ~MyClass() { Dispose(false); } 可以多次调用MyClass实例的Dispose()方法吗?

从C#和垃圾收集中的事件中分离匿名侦听器

假设我有一个名为Dialog的类,它扩展了Form。 对话框上有一个文本框和一个OK按钮,当用户单击OK时,将通过事件返回文本框值: public class Dialog: Form { public delegate void onDialogValueReturned(object sender, DialogEventArgs e); public event onDialogValueReturned DialogValueReturned; . . . OKButton.Click += (sender, evt) => { DialogEventArgs e = new DialogEventArgs(); e.Value =myTextBox.Text; DialogValueReturned(this, e); this.Close(); }; 在我的调用表单中,我在本地方法中实例化一个对话框: private void Foo() { Dialog D = new Dialog(“blah blah”); D.DialogValueReturned += (dialog, evt) => { […]

垃圾收集对象跨越AppDomain边界

当您将从MarshalByRefObjectinheritance的对象传递给另一个AppDomain时,由创建它的AppDomain引发的GC.Collect()不会收集该对象,前提是该对象在GC.Collect时间内未在任一AppDomain中生根( )叫? [当我说没有根源时,我的意思是没有开发人员编写代码可以访问它。] 似乎对象没有被收集,而是被提升到下一代! 但是,如果我停止将对象传递给diff AppDomain,它将按预期收集。 这种行为是设计的吗? 如果是这样理由? 多谢你们, PS我知道代码中的GC.Collect()有很多原因,我只是想了解GC将如何发生在MBRO上。

GC根和局部变量

在查看Timer文档时,我使用以下注释运行了以下示例: // Normally, the timer is declared at the class level, // so that it stays in scope as long as it is needed. // If the timer is declared in a long-running method, // KeepAlive must be used to prevent the JIT compiler // from allowing aggressive garbage collection to occur // before the […]

如何在GC完成列表中列出所有对象?

我的程序崩溃了,它是VS的可视化工具,所以,它很难调试,我试图进行转储并使用WinDbg来研究它,但它不成功。 所以,现在我尝试以编程方式将手放在该列表上,但我不知道如何。 谢谢。

Win32.DestroyIcon与Icon.Dispose

我有这行代码: System.Drawing.Icon icon = System.Drawing.Icon.FromHandle(shinfo.hIcon); 几行之后,在使用图标之后,我有一行: Win32.DestroyIcon(shinfo.hIcon); 但是,当对我的代码运行静态分析时,它表示Resource_Leak可能来自图标。 我想知道如果我调用dispose方法会有什么不同: icon.Dispose(); 而不是现在正在使用的Win32.DestroyIcon()。 它们之间有什么区别吗? 我只是维护这段代码所以我不确定原始开发人员是否有任何使用Win32.DestroyIcon的特殊内容。