Tag: 垃圾收集

将参数传递给Task.Factory.StartNew

给出以下代码: string injectedString = “Read string out of HttpContext”; Task.Factory.StartNew(() => { MyClass myClass = new MyClass(); myClass.Method(injectedString); } 这是将字符串传递给任务/线程的最佳方法吗? 我对这种方法的担忧是: 垃圾收集器是否知道字符串何时脱离上下文并正确清理它? 是否有更好的方法将依赖项注入到主线程中断开对象链接的任务? 这是在Asp.Net网络服务中,如果它很重要并且是一个火灾和忘记类型的线程,我不是在等待任何类型的响应。 我的字符串实际上是从HttpContext读出来的,这是我以这种方式注入它的一个原因(Thread无法访问调用线程HtppContext )

未分配给变量的类实例是否会过早收集垃圾?

(我甚至不知道我的问题是否有意义;这只是我不理解的东西,并且在我的脑海里旋转了一段时间) 考虑使用以下课程: public class MyClass { private int _myVar; public void DoSomething() { // …Do something… _myVar = 1; System.Console.WriteLine(“Inside”); } } 并使用这样的类: public class Test { public static void Main() { // …Some code… System.Console.WriteLine(“Before”); // No assignment to a variable. new MyClass().DoSomething(); // …Some other code… System.Console.WriteLine(“After”); } } ( Ideone ) 上面,我正在创建一个类的实例而不将其分配给变量。 […]

一段时间后,FileSystemWatcher停止引发事件

我们已经构建了一个使用FileSystemWatcher监听文件夹的窗口服务,在创建时我们处理文件,依此类推。 但是几天后事件就停止了。 它可能被垃圾收集器(GC)收集吗? GC是否收集持有类(单身)? 我应该使用弱事吗? 我是否有错误意味着事件未注册? 我认为问题是,FSW有一个内部缓冲区,当它溢出错误时,请看一下本文提供的代码来解决这个问题。 希望这有助于任何人。

如何使用IDisposable来修复内存泄漏

我有一个.net应用程序似乎有内存泄漏问题。 .net服务启动大约100MB的内存,但在负载下它大约400-500MB。 我的大多数类没有非托管资源,而且已经实现了IDisposable。 所以我的问题是在我的课程帮助上打字IDisposable? 4-500 MB本身并不关心。 关注的是有8种不同的服务。 每个都是使用SharpArch,NServiceBus,Windsor和NHibernate构建的。 我的感觉是,其中一个中的某些东西导致了问题。 我担心的是,所有服务的总内存大约是3.2到3.6 gig的内存。 它还没有抛出OutOfMemoryexception,但我想在传球时把它关掉。 我也使用了dotTrace,它给了我一些信息,我只是不确定如何对这些信息采取行动

使用Image.FromFile不会释放文件句柄

我正在将多个多图像tiff文件连接到单个多图像tiff文件,并且在删除源tiff文件时遇到问题,因为Image类继续保持它们的句柄。 我正在通过Image.FromFile读取tiff图像: Bitmap resultTiff = (Bitmap) Image.FromFile(strImageFile); 之后我以相同的方式读取所有其他tiff图像并将它们附加到生成的tiff图像。 当我完成后,我使用此代码来释放引用并保存生成的文件: ep.Param[0] = new EncoderParameter(enc, (long) EncoderValue.Flush); resultTiff.SaveAdd(ep); resultTiff.Dispose(); 现在的问题是文件句柄仍然存在 (因此文件无法删除),除非我在resultTiff.Dispose()调用之后调用GC.Collect() 。 您可以想象通过调用GC我感觉不舒服,那么还有其他方法可以实现吗?

C#中的垃圾收集没有进行。 为什么?

我尝试过一个简单的实验来validation垃圾收集器的function。 引用3.9关于.NET中自动内存管理的自动内存管理 (MSDN)。 对我来说,它听起来像是C ++中的共享指针。 如果对象的引用计数器变为零,则它将被垃圾收集器解除分配。 所以我尝试在主窗体中创建一个函数。 该函数在我的主窗体的Shown事件函数内调用,该函数在构造函数之后执行。 这是实验代码。 public void experiment() { int[] a = new int[100000]; int[] b = new int[100000]; int[] c = new int[100000]; int[] d = new int[100000]; a = null; b = null; c = null; d = null; } 以下是结果: 在内存分配之前 内存分配后 在离开function范围之前 离开function范围后 为什么垃圾收集器即使在设置为null之后也不释放由数组a,b,c,d分配的内存?

C#.NET垃圾收集无法正常运行?

我正在Visual Studio 2010中开发一个相对较大的解决方案。它有各种项目,其中一个是XNA Game-project,另一个是ASP.NET MVC 2项目。 对于这两个项目,我面临同样的问题:在调试模式下启动它们后,内存使用率不断上升。 它们的内存使用率分别为40和100MB,但两者都相对较快地升至1.5GB(分别为10分钟和30分钟)。 之后它有时会回落到接近初始使用状态,有时它会抛出OutOfMemoryExceptions 。 当然这表明存在严重的内存泄漏,所以这是我最初试图发现问题的地方。 在不成功地搜索泄漏之后,我尝试定期调用GC.Collect() (大约每10秒一次)。 在引入这个“hack”之后,内存使用量分别保持在45和120MB 24小时(直到我停止测试)。 .NET的垃圾收集应该是“非常好的”,但我不禁怀疑它只是不起作用。 我使用CLR Profiler试图解决问题,它表明XNA项目似乎已经保存了很多我确实使用的字节数组,但是引用应该已经被删除,因此被垃圾收集集电极。 同样,当我定期调用GC.Collect() ,内存使用问题似乎已经消失。 有谁知道什么可能导致这种高内存使用? 是否可能与在调试模式下运行有关?

使用委托创建垃圾

我正在使用XNA为xbox360开发游戏。 在Xbox上,与PC上的垃圾收集器相比,垃圾收集器的性能相当差,因此将生成的垃圾保持在最低限度对于顺畅执行游戏至关重要。 我记得读过一次调用委托创建垃圾,但现在我的生活中找不到任何对委托创建垃圾的引用。 我是刚刚做到这一点还是代表们搞乱了? 如果代表是凌乱的,建议解决方法的奖励积分。 public delegate T GetValue(T value, T[] args); public static T Transaction(GetValue calculate, ref T value, params T[] args) where T : class { T newValue = calculate(value, args); return foo(newValue); } 我的代码看起来模糊不清,目前,我能想到摆脱委托的唯一解决方案是传入一个inheritance了接口IValueCalculator的类,然后我可以在该接口上调用该方法,这不是很整洁虽然!

可以在后台线程中运行GC.Collect吗?

在这个SO答案之后 ,我正在做: ThreadPool.QueueUserWorkItem( delegate { GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); }); 我的目标是在关闭一个包含大量图像/ PictureBox控件的大型WinForms表单后进行垃圾收集运行,以确保我的内存中不再有图像。 (我确实相信我遵循Jon Skeet的指示 )。 我在后台线程中这样做是为了尝试让我的UI响应。 我的问题: 它是否为我在后台线程中进行垃圾收集带来了什么好处? 或者它实际上使我的应用程序更慢/挂起更长?

如何强制MemoryStream占用释放内存?

我有以下代码: const int bufferSize = 1024 * 1024; var buffer = new byte[bufferSize]; for (int i = 0; i < 10; i++) { const int writesCount = 400; using (var stream = new MemoryStream(writesCount * bufferSize)) { for (int j = 0; j < writesCount; j++) { stream.Write(buffer, 0, buffer.Length); } stream.Close(); } } 我在32位机器上运行。 […]