Tag: 内存泄漏

WPF内存泄漏

我有一个简单的wpf应用程序。 在主窗口中,我有堆栈面板和2个按钮。 第一个按钮添加了100个用户控件(没有任何数据绑定,事件,位图),第二个按钮从面板中删除所有这些控件并调用GC.Collect()。 并且存在一些问题:1。在我第一次单击“删除”按钮后,并非所有内存都释放,我必须单击几次以释放更多内存。 2. 5-10分钟内存释放后,但不会有几兆字节。 例如,在我的应用程序启动后,当我添加500个控件时需要~22mb – 在我第一次点击“删除”按钮后~~~60mb~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ,我不明白这一点,我是WPF的新手,也许我想念一些我想立即释放内存的东西。 namespace WpfApplication10 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void button1_Click(object sender, RoutedEventArgs e) { int N = 100; //var r = new ActivityStatisticItem(“111”, “222”, DateTime.Now, “333”, 1); for (int i = 0; i < N; i++) { […]

具有自动记忆清洁function的图像下载器

我有一个列表(简单ListBox)的项目与主要细节基础上的图像(如果用户点击列表项,详细信息页面打开)。 我在这里 , 这里 , 这里和这里描述了图像内存泄漏的相当着名的问题。 一种可能的方法是在NavigatingFrom 和清理它们时浏览所有图像 。 在其中一个线程中 ,我找到了更有趣的解决方案:它自动清理图像,但这不适用于虚拟化(图像丢失或混合,如果添加私有字段用于存储ImageSource)。 建议的解决方法是添加依赖项属性。 但是我仍然面临同样的问题:图像在向下滚动并返回后混淆了。 看起来依赖属性是随机改变的,但我不能抓住他们改变的那一刻。 public class SafePicture : ContentControl { public static readonly DependencyProperty SafePathProperty = DependencyProperty.RegisterAttached( “SafePath”, typeof(string), typeof(SafePicture), new PropertyMetadata(OnSourceWithCustomRefererChanged)); public string SafePath { get { return (string)GetValue(SafePathProperty); } set { SetValue(SafePathProperty, value); } } private static void OnSourceWithCustomRefererChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) { […]

如何在Visual Studio中读取内存快照

我使用Visual Studio获取应用程序的内存快照。 我有一些关于理解我得到的数据的问题。 在我捕获内存快照后,我过滤掉了我的一个类,比如MyClassPanel。 我只在我的xmal文件中使用MyClassPanel。 为什么MyClassPanel的’Paths to Root’都是’MyClassPanel [RefCount Handle,Count:1]’? (即同名,但带有字符串[最后的RefCount句柄]和不同的Count值)这是什么意思? 在其他类中,我过滤,我看到’Paths to Root’是不同的类名。 我有24个MyClassPanel(来自顶部表中的计数)。 在底部表格的“参考计数”列中,当我添加它们时,它们是24。 总是这样吗? 我认为’Count’和’Reference Count’意味着不同的东西。 在这种情况下,他们加起来。 这有意义吗?

如果实例已经处理掉,在不调用EndXXX的情况下调用BeginXXX是否安全

使用异步编程模型时 ,通常建议将每个BeginXXX与EndXXX匹配,否则在异步操作完成之前可能会泄漏资源。 如果类实现了IDisposable并且通过调用Dispose实例,情况仍然如此吗? 例如,我在UdpListener使用UdpClient.BeginReceive : class UdpListener : IDisposable { private bool _isDisposed; private readonly IPAddress _hostIpAddress; private readonly int _port; private UdpClient _udpClient; public UdpListener(IPAddress hostIpAddress, int port) { _hostIpAddress = hostIpAddress; _port = port; } public void Start() { _udpClient.Connect(_hostIpAddress, _port); _udpClient.BeginReceive(HandleMessage, null); } public void Dispose() { if (_isDisposed) { throw new […]

在.NET等托管环境中是否可能发生内存泄漏?

在C ++中,很容易产生永久性内存泄漏 – 只需分配内存而不释放内存: new char; //permanent memory leak guaranteed 并且该内存在堆的生命周期内保持分配(通常与程序运行时持续时间相同)。 在C#程序中是否可以(在内存管理机制正常工作的情况下导致特定的未引用对象的情况相同)? 我仔细阅读了这个问题并给出了答案,它提到了一些导致内存消耗高于预期的情况或IMO相当极端的情况,比如终结器线程死锁,但是在C#程序中可能会发生永久性泄漏而且function正常内存管理?

我是否需要在每个’foreach’迭代中释放COM对象?

这是(潜在的)问题: 我创建一个COM对象,然后使用’foreach’迭代它返回的集合中的每个元素。 我是否需要释放我在集合中迭代的每个元素? (参见下面的代码。)如果是这样,我想不出有效地从’finally’语句中释放它的方法,以防万一在项目被操作时出现错误。 有什么建议? private static void doStuff() { ComObjectClass manager = null; try { manager = new ComObjectClass(); foreach (ComObject item in manager.GetCollectionOfItems()) { Log.Debug(item.Name); releaseComObject(item); // <– Do I need this line? // It isn't in a 'finally' block… // …Possible memory leak? } } catch (Exception) { } finally { releaseComObject(manager); […]

.Net内存在创建大量线程时泄漏

我有一个应用程序,随着时间的推移创建了很multithreading。 我注意到内存使用量随着运行而增长,并最终耗尽内存。 但是同样的代码不会泄漏我同事环境中的内存。 我们都有相同的.net版本。 我能够使用以下示例代码重现该问题,该代码不会在我的同事的笔记本电脑上泄漏,而是在我的笔记本电脑上泄漏。 public static void Main(string[] args) { Console.WriteLine(“Version ” + Environment.Version.ToString()); if (Environment.Is64BitProcess) Console.WriteLine(“64”); else Console.WriteLine(“32”); while(true) { Thread t = new Thread(() => { Thread.Sleep(1); }); t.IsBackground = true; t.Start(); Thread.Sleep(1); } } 当我运行上面的内容时,会打印以下内容 Version 4.0.30319.18063 32 在Visual Studio 2012中,项目的目标框架是.net framework 4.5。 该项目通过以下配置泄漏内存 Project Properties -> Build Platform target: Any […]

试图替换Controls.Clear()以避免内存泄漏不起作用 – 为什么?

我换了: panel.Controls.Clear(); 有: Clear(panel); 哪里: public static void Clear(Control ctrl) { while (ctrl.Controls.Count > 0) ctrl.Controls[0].Dispose(); } 我得到以下错误:在Application.Run(new Form1()); System.ObjectDisposedException未处理无法访问已处置的对象。 对象名称:’标签’。 知道为什么会这样吗? 谢谢。 编辑:请参阅如何清除()控件而不会导致内存泄漏 编辑:对不起,我可能正在处理我想从其父母中删除的内容。 我会检查一下。 谢谢你的回答。

Process.GetProcessesByName(String,String)内存泄漏

我有一段代码,使用静态方法Process.GetProcessesByName(String,String)获取远程计算机上的进程列表,这可以在很多计算机上运行(几千个),我注意到它的原因是主要的内存泄漏。 我运行了ANTS内存分析器,它告诉我,我的大部分内存都是字符串,字符串包含诸如“%Idle Time”,“Processor Information”和“Cache Faults / sec”之类的存储值。 我已经认识到这些字符串可能是程序中性能计数器的一部分,问题是我在程序中没有任何性能计数器。 深入挖掘发现这些字符串保存在由PerformanceCounterLib保存的哈希表中,这些哈希表由另一个哈希表保存,该哈希表存储在PerformanceCounterLib类的内部静态成员(本身就是内部)中。 深入挖掘兔子洞,我发现Process.GetProcesesByName使用PerformanceCounterLib来获取在远程计算机上运行的进程列表,并且对于每个远程计算机,在PerformanceCounterLib的静态内部变量中创建并引用另一个PerformanceCounterLib实例。 这些实例中的每一个都认为我发现的字符串哈希表会堵塞我的记忆(每个字符串都在300-700 kb之间,这意味着它会堵塞我的大对象堆)。 我没有找到删除那些未使用的PerformanceCounterLib实例的方法,它们都是内部的,用户无法访问它们。 我该如何解决我的记忆问题? 这真的很糟糕,我的程序在24小时内达到5GB(我的服务器限制)。 编辑 :添加了一段应该重现问题的代码(未经测试)。 为了澄清: /// computerNames is a list of computers that you have access to public List GetProcessesOnAllComputers(List computerNames) { var result = new List(); foreach(string compName in computernames) { Process[] processes = Process.GetProcesses(compName); // Happens with every method that […]

托管代码中是否可能存在内存泄漏? (特别是C#3.0)

例如,如果我有一个分层数据结构: class Node { public List children; } 然后在其中一个父母中填充到很多级别: myNode.children.Clear(); 这将清除所有对直系孩子的提及 – 但那些直系孩子所引用的所有大孩子,大孙子等等呢? C#聪明到知道它们不再需要它们会被垃圾收集吗? 我已阅读使用WPF数据绑定而没有实现接口INotifyChanged可能导致内存泄漏: http : //blogs.msdn.com/b/micmcd/archive/2008/03/07/avoiding-a-wpf-memory-leak-with-数据绑定-black-magic.aspx ,在托管环境中这怎么可能?