Tag: memory leaks

c#picturebox内存释放问题

我是C#的新手。 我必须在工作线程中重复刷新GUI图片框。 从使用GetImage方法轮询驱动程序的相机获取图像,该方法检索要显示的图像。 即使我使用指令“using”分配位图并显式调用GC,内存似乎永远不会被释放。 工作线程是这样的: while (true) { // request image with IR signal values (array of UInt16) image = axLVCam.GetImage(0); lut = axLVCam.GetLUT(1); DrawPicture(image, lut); //GC.Collect(); } 虽然DrawPicture方法是类似的 public void DrawPicture(object image, object lut) { […] // We have an image – cast it to proper type System.UInt16[,] im = image as System.UInt16[,]; float[] […]

如何调试潜在的内存泄漏?

我编写了Windows服务程序来做日常工作。 我安装它到Windows服务,它会唤醒并做一些事情然后thread.sleep(5min) 代码很简单,但我注意到了潜在的内存泄漏。 我使用DOS tasklist跟踪它并绘制了一个图表: 我可以说很明显存在内存泄漏,尽管很少。 我的代码如下,请帮我找到潜在的泄漏。 谢谢。 public partial class AutoReport : ServiceBase { int Time = Convert.ToInt32(AppSettings[“Time”].ToString()); private Utilities.RequestHelper requestHelper = new RequestHelper(); public AutoReport() { InitializeComponent(); } protected override void OnStart(string[] args) { Thread thread = new Thread(new ParameterizedThreadStart(DoWork)); thread.Start(); } protected override void OnStop() { } public void DoWork(object data) { […]

使用C#加载内存泄漏的图像

我的应用程序中存在内存泄漏问题,它会加载大量图像。 我对C#很陌生,并认为我的内存泄漏问题已经过去了。 我无法弄清楚问题 – 也许我正在使用一些我无法正确处理的非托管模块? 为了说明我的问题,我简化了导致问题的核心,并将其转移到一个干净的项目中。 请注意,这都是愚蠢的代码,不能反映它来自的原始应用程序。 在测试应用程序中,我有2个按钮,触发两个事件。 按钮1 – 创建:将对象设置为datacontext。 这将通过将对象设置为DataContext来加载图像并使它们保持活动状态: var imgPath = @”C:\some_fixed_path\img.jpg”; DataContext = new SillyImageLoader(imgPath); 按钮2 – 清理:我的理解是,如果我放开持有SillyImageLoader并再次保存图像的引用,那么这将被删除。 我还明确地触发垃圾收集,只是为了在删除引用后立即查看内存量。 DataContext = null; System.GC.Collect(); 测试时我正在加载一个974KB的jpeg图像。 保持30位图表示可以将我的应用程序的内存使用量从大约18MB增加到大约562MB。 好。 但是当我清理时,内存只下降到~292MB。 如果我重复Create + CleanUp,我还剩下另外250MB内存。 所以显然有人仍然持有某种东西。 这是SillyImageLoader代码: namespace MemoryLeakTest { using System; using System.Drawing; using System.Windows; using System.Windows.Interop; using System.Windows.Media.Imaging; public class SillyImageLoader { private […]

UI Thread .Invoke()导致句柄泄漏?

在什么情况下,在使用委托和.InvokeRequired时,从非UI线程更新UI控件可能会导致进程的句柄不断增加? 例如: public delegate void DelegateUIUpdate(); private void UIUpdate() { if (someControl.InvokeRequired) { someControl.Invoke(new DelegateUIUpdate(UIUpdate)); return; } // do something with someControl } 当在循环或定时器间隔中调用此方法时,程序的句柄会不断增加。 编辑: 如果以上内容被注释掉并修改如下: public delegate void DelegateUIUpdate(); private void UIUpdate() { //if (someControl.InvokeRequired) //{ // someControl.Invoke(new DelegateUIUpdate(UIUpdate)); // return; //} CheckForIllegalCrossThreadCalls = false; // do something with someControl } …然后句柄停止递增,当然我不想允许跨线程调用。 编辑2: 这是一个显示句柄增加的示例: […]

Windows Phone 8里面的LongListSelector内存泄漏图片

我有一个LongListSelector,它包含一个从Web加载大量图像的图像控件,这个工作正常一段时间,但是在我加载了一些图像后,我得到了内存exception。 我读过其他人对于内存不足以及大量图片有相同问题,但仍然没有找到解决方案。 我已经读过它与image / BitmapImage缓存有关。 这是我的LongListSelector,它包含图像控件: 在我的MainPage.xaml.cs中,我设置了LongListSelector的DataContext: llsGameList.DataContext = gd.GetGamesListItems; 这是我用来存储我的图像的类: public class GetGamesList { public Uri BoxArtFrontThumb { get; set; } } 这是包含所有图像的ObservableCollection: private ObservableCollection _GetGamesListItems = new ObservableCollection(); public ObservableCollection GetGamesListItems { get { return this._GetGamesListItems; } } 我希望我能清楚地解释清楚。 我真的希望有人可以帮助我解决这个记忆问题。 谢谢。

MonoTouch:应用程序因低内存而被杀,为什么? 实时字节分配5 MB顶部

我的iPad应用程序是用MonoTouch开发的,因为我想避免所有的内存管理地狱,但事实并非如此。 在模拟器上一切正常,但是当我在设备上测试我的应用程序时,我惊恐地发现它在一些内存警告后很快被操作系统杀死了。 我的应用程序是一个简单的图像浏览器,它加载一些PNG图像并使用UIScrollView中的一些UIViews显示它们,在触摸时加载下一个或前一个。 在模拟器上它工作正常。 但是在加载和卸载大约6-11个图像后的设备上,它开始获得内存警告,然后突然该过程被杀死。 我检查了所有的实例循环,并在加载新图像之前正确删除了所有引用。 所以我启动了仪器并开始在iPad上分析我的应用程序的内存分配。 在那里,我发现Live字节只有大约5-9 MB,正如我所期望的那样,但由于一些奇怪的原因,死内存分配几乎完全没有收集,因为在分配了大约50 MB(小于5-9 MB的它是Live Bytes)它被杀了! 以下是我的应用程序的Instruments分析会话的屏幕截图: 这是快照序列: 还有一些小漏洞,但我认为它们不够大,不足以成为罪魁祸首。 它们都是来自strdup的48个字节泄漏,这是在iOS 5.1中发布UIScrollView时的一个已知问题: 即使一切看起来还不错,分配的Live Bytes仍然是5 MB,我的应用程序的REAL内存呈指数级增长,然后在iPad上被杀死高达50MB,而iPhone4S上的高达314 MB,如内存监视器所报告: 有人可以告诉我是否有方法或实用工具来发现问题的原因和位置? 这是一个单调垃圾收集器的错误吗? 还是有一些我没有正确处理的物体? 我怎么能用剖面仪找到那些? 我已经检查了两天我的代码,但一切似乎都正确。 这是我的加载/实例化/处置周期的代码: void StartImageLoadingThread() { tokenSource = new CancellationTokenSource (); token = tokenSource.Token; Task task1 = new Task( () => PerformLoadImageTask(token),token); task1.Start(); } void PerformLoadImageTask(CancellationToken token) { if (token.IsCancellationRequested) { […]

Silverlight + MVVM + Bindings =内存泄漏?

到目前为止,我的测试表明,在Silverlight中利用MVVM模式的所有标准方法,示例和框架都存在一个巨大的问题:大量内存泄漏会阻止VM被垃圾回收。 显然这是一个巨大而荒谬的主张 – 所以我的期望是有人会明白我为什么以及在哪里出错:) 重现的步骤很简单: 通过将视图datacontext设置为VM,将viewmodel绑定到视图(假设viewmodel利用INotifyPropertyChanged来支持数据绑定) 将UI元素绑定到viewmodel上的属性,例如: 以某种方式利用绑定(例如 – 只需键入文本框)。 这将创建一个从根,BindingExpression扩展到viewmodel的引用链。 然后,您可以从UI树中删除View以及所有对VM的引用 – 但是由于root BindingExpression VM引用链,VM永远不会被垃圾回收。 我创建了两个说明问题的例子。 它们有一个按钮来创建一个新的视图/视图模型(它应该转储对旧视图的所有引用)和一个强制垃圾收集并报告当前内存使用情况的按钮。 示例1是超级剥离的校准微型示例。 示例2不使用框架,只是以我能想到的最简单的方式说明问题。 例1 例2 对于那些可能想要帮助但又不想下载示例项目的人,这里是代码2的代码。我们从一个名为FooViewModel的viewmodel开始: public class FooViewModel : INotifyPropertyChanged { string _fooText; public string FooText { get { return _fooText; } set { _fooText = value; NotifyPropertyChanged(“FooText”); } } private byte[] _data; public FooViewModel() { _data […]

调试.NET内存泄漏 – 如何知道什么是什么?

我正在开发一个似乎存在内存泄漏的.NET应用程序。 我知道教科书的答案,事件应该取消订阅,一次性物品应该处理等… 我有一个可以重现错误的测试工具。 在某个类的终结器中,我写入控制台 public class Foo { // Ctor public Foo() { } ~public Foo() { Console.WriteLine(“Foo Finalized”); } } 在测试工具中,我创建了一个Foo实例(它反过来创建并与数百种其他类型交互)然后删除它并调用垃圾收集器。 我发现从未调用过Foo Finalizer。 我有一个类似的类与此设置,最终确定为控制测试。 所以我的问题是: 我怎样才能确定使用商业或开源工具究竟是什么引用了Foo? 我拥有dotTrace Memory Profiler的专业许可,但无法从帮助文件中找出如何使用它。 更新:我现在使用dotMemory 4.0 ,这是(好的,但无法使用的)dotTrace Memory 3.5的inheritance者。

识别IDisposable对象

我必须检查一些其他人有一些内存泄漏的代码。 现在我正在搜索一次性对象以使用using语句对它们进行包围,我想知道是否有一种快速方式告诉你所有声明的一次性对象。我的意思是像resharper或另一个visual studio插件。 谢谢。

代表可以导致内存泄漏吗? GC.TotalMemory(true)似乎表明了这一点

码 using System; internal static class Test { private static void Main() { try { Console.WriteLine(“{0,10}: Start point”, GC.GetTotalMemory(true)); Action simpleDelegate = SimpleDelegate; Console.WriteLine(“{0,10}: Simple delegate created”, GC.GetTotalMemory(true)); Action simpleCombinedDelegate = simpleDelegate + simpleDelegate + simpleDelegate; Console.WriteLine(“{0,10}: Simple combined delegate created”, GC.GetTotalMemory(true)); byte[] bigManagedResource = new byte[100000000]; Console.WriteLine(“{0,10}: Big managed resource created”, GC.GetTotalMemory(true)); Action bigManagedResourceDelegate […]