Tag: memory leaks

如何避免内存泄漏?

我可以使用哪些提示来避免应用程序中的内存泄漏? 我有什么可以留意的陷阱或陷阱吗?

WPF元素主机内存泄漏

我在Windows窗体上使用元素主机有一个奇怪的内存泄漏。 我有一个主窗体,它打开另一个窗体,一个只有元素主机控件的窗体(此时,它没有一个wpf控件子窗口)。 只能打开1个主机表单。 每次打开表单时,应用程序内存都会增加20Mb,当表单关闭时不会自由,因此,在打开主机表单几次后,我的内存耗尽! 现在,如果我从表单中删除元素主机,内存保持稳定。 我一直在运行CLRProfiler和ANTS,但我发现所有问题都存在于元素主机上,我没有找到任何解决方法。 wpfHost是开箱即用的,只是从工具栏拖到winForm。 知道怎么解决这个问题?

.NET JIT代码缓存泄漏?

我们有一个用.Net 3.5编写的服务器组件。 它作为Windows Server 2008 Standard Edition上的服务运行。 它运作良好,但经过一段时间(天)后,我们注意到了大幅减速和增加的工作量。 我们期望某种内存泄漏并使用WinDBG / SOS来分析进程的转储。 不幸的是,GC Heap没有显示任何泄漏,但我们注意到JIT代码堆在启动后从8MB增长到几天后超过1GB。 我们自己不使用任何动态代码生成技术。 我们使用以动态代码生成而闻名的Linq2SQL,但我们不知道它是否会导致这样的问题。 主要问题是,是否有任何技术来分析转储并检查WinDBG转储中显示的所有主机代码堆块来自何处? [更新] 与此同时,我们做了一些更多的分析,并将Linq2SQL作为可能的怀疑,特别是因为我们不使用预编译查询。 以下示例程序创建完全相同的行为,其中随着时间的推移创建越来越多的主机代码堆块。 using System; using System.Linq; using System.Threading; namespace LinqStressTest { class Program { static void Main(string[] args) { for (int i = 0; i < 100; ++ i) ThreadPool.QueueUserWorkItem(Worker); while(runs < 1000000) { Thread.Sleep(5000); } } static […]

打开MediaPlayer – 在Thread中未处理的事件

我正在尝试创建一个媒体播放器(使用Media.MediaPlayer()类),为此我使用一个线程来处理用户使用OpenFileDialog加载的歌曲。 我正在使用下一个代码来启动歌曲的过程: public static List MediaList = new List(); public static Queue MediaFilesQueue = new Queue(); public static void AddMediaFilesToMediaList() { String pathToFile; while (MediaFilesQueue.Count > 0) // all the files are loaded into the Queue before processing { pathToFile = MediaFilesQueue.Dequeue(); MediaData.MediaList.Add(new MediaFile(pathToFile)); MediaFileCreator mfCreator = new MediaFileCreator(MediaData.MediaList.Count – 1); mfCreator.CreateNewMediaFile(); } } 这是MediaFileCreator类: […]

在C#中手动取消固定byte ?

在下面的代码中,似乎client.Connect.Receive永久地固定“byte []结果”,导致永远不会释放内存(因为它总是被固定)。 我正在寻找一种方法来告诉C#在使用它之后不再需要固定它.OnReceive,但我找不到内置函数或关键字来执行此操作。 有谁知道如何让C#取消固定byte []数组? (这是我的C#应用​​程序中的内存泄漏源之一) this.m_TcpListener = new TcpListener(this.p_TcpEndPoint.Port); this.m_TcpThread = new Thread(delegate() { try { this.m_TcpListener.Start(); while (this.p_Running) { TcpClient client = this.m_TcpListener.AcceptTcpClient(); new Thread(() => { try { // Read the length header. byte[] lenbytes = new byte[4]; int lbytesread = client.Client.Receive(lenbytes, 0, 4, SocketFlags.None); if (lbytesread != 4) return; // drop […]

.NET是否删除父类会将子项变为“垃圾”?

假设您有一个Collection ,并且您即将删除一个项目。 B的实例从A的实例引用,并引用C的实例,如第一张图所示: 图A http://sofzh.miximages.com/c%23/240wuqh.png 现在,由于有一个指向B的引用,因此毫无疑问该对象被“删除”或被垃圾收集。 它只是从集合中删除,就像这样,对吗? 图B http://sofzh.miximages.com/c%23/4uxnp3.png 现在,让我们有一个Collection具有与以前相同的引用层次结构,让我们删除A的实例。 图C http://sofzh.miximages.com/c%23/1zd93dt.png 如果没有其他对A引用,不仅它从集合中删除,它被标记为垃圾。 我对吗? 那么B和C呢? 它们是否也成为垃圾,除非B引用C实例,否则没有其他引用? 这是我所面临的简化。 我想从集合中删除一个A实例,我想确保B和C一起使用它。 在我不再收集A的地方,所有仍然活着的“孩子”对我来说都是memory leaks。 当我看到我制作的这些照片时,它似乎太愚蠢了。 但我的情况有点不那么微不足道 。 它看起来像这样: 图4 http://sofzh.miximages.com/c%23/2ymhlq0.png 在图片中,Model层为黄色,ViewModel层为绿色 ‘A ViewModel’类引用其A Model A Model有一个B Model实例的集合( B是A的子A ,在Model和ViewModel层中都是如此) 每个B Model “知道它的父亲” – 引用其父“模型”实例 回到VM层,’A ViewModel’拥有’B ViemModel’项目的集合 任何好的ViewModel,’B ViewModel’引用’B模型’ 我有一个A ViewModel实例的集合。 当我删除一个时,我需要其他所有内容。 如果所涉及的任何实例都没有其他“外部参考”(基本上,没有其他箭头指向图片外部),被移除的“ViewModel”实例是否会将所有孩子带走? 如果是这样,是否有任何“陷阱”可以使这种简化误导? 如果我完全错了,为什么? 🙂 感谢您阅读这篇文章!

Bitmap.Save,巨大的内存泄漏

我有一个应用程序,我正在使用位图并使用GZipStream压缩它并通过套接字将其发送到内存中。 我已经将脏的scumbag内存泄漏跟踪到以​​下行: frame.Save(inStream, jpegCodec, parameters); 浏览好的信息高速公路我发现了很多关于Image类泄漏内存的主题在各种编解码器的保存方法中。 问题是我找不到任何修复方法。 所以我的问题如下: 是什么原因造成的 我怎样才能解决这个问题 这是我的FrameStream类中的完整Write()方法,其中包含泄漏。 /// /// Writes a frame to the stream /// /// The frame to write public void Write(Bitmap frame) { using (EncoderParameter qualityParameter = new EncoderParameter(Encoder.Quality, 50L)) { using (EncoderParameters parameters = new EncoderParameters(1)) { parameters.Param[0] = qualityParameter; ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo jpegCodec = […]

WPF Combobox“泄漏”内存

我遇到了WPF中的combobox问题,它们似乎挂在它们打开的第一个DataContext上。 当我在ComboBox上更改DataContext时,子PopupRoot对象仍然引用旧的DataContext。 起初我以为我们做错了什么,但我在弄清楚可能是什么时遇到了麻烦,所以我试图简化。 我已经设法以一种非常简单的forms重新创建了我在应用程序中看到的行为,因此它看起来更像是WPF ComboBox实现中的一个错误。 这听起来有点争议,所以我想我会转向stackoverflow寻求帮助。 该示例的核心代码如下: Reload Model public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); var newModel = new ViewModel(); ComboBox.DataContext = newModel; } private void ReloadModel(object sender, RoutedEventArgs e) { var newModel = new ViewModel(); ComboBox.DataContext = newModel; } } public class ViewModel : INotifyPropertyChanged { public ViewModel() : […]

C#处理IDisposable

有人可以解释如果你不Dispose一些IDisposable实体(通过using或直接Dispose调用)可能会发生什么? 这是否总是导致内存泄漏?如果是, C#内存泄漏类似于C++内存泄漏,它们很容易导致崩溃,或者从这个角度看C#沙箱是否更安全? 谢谢。

防止所有者垃圾收集的线程

在我创建的库中,我有一个类DataPort,它实现类似于.NET SerialPort类的function。 它与某些硬件进行通信,并且只要数据通过该硬件进入就会引发事件。 为了实现此行为,DataPort会旋转一个预期与DataPort对象具有相同生命周期的线程。 问题是当DataPort超出范围时,它永远不会被垃圾收集 现在,因为DataPort与硬件(使用pInvoke)对话并拥有一些非托管资源,所以它实现了IDisposable。 当您在对象上调用Dispose时,一切都正常。 DataPort摆脱了所有非托管资源并杀死了工作线程并消失了。 但是,如果您只是让DataPort超出范围,垃圾收集器将永远不会调用终结器,并且DataPort将永远保留在内存中。 我知道这种情况有两个原因: 终结器中的断点永远不会被击中 SOS.dll告诉我DataPort仍然存在 补充:在我们继续前进之前,我会说是的,我知道答案是“Call Dispose()Dummy!” 但我认为,即使你让所有引用超出范围, 最终应该发生正确的事情,垃圾收集器应该摆脱DataPort 回到问题:使用SOS.dll,我可以看到我的DataPort没有被垃圾回收的原因是因为它旋转的线程仍然具有对DataPort对象的引用 – 通过隐含的“this”参数线程正在运行的实例方法。 正在运行的工作线程不会被垃圾回收 ,因此在正在运行的工作线程范围内的任何引用也不符合垃圾回收的条件。 线程本身基本上运行以下代码: public void WorkerThreadMethod(object unused) { ManualResetEvent dataReady = pInvoke_SubcribeToEvent(this.nativeHardwareHandle); for(;;) { //Wait here until we have data, or we got a signal to terminate the thread because we’re being disposed int signalIndex = […]