Tag: 内存泄漏

使用正则表达式的缺点

最近我的经理告诉我不要太依赖Regex,因为它有很多缺点。 当我试图了解更多时,我听说它有像正则表达式这样的问题可能导致内存泄漏,因为一些对象在使用后仍继续挂在字符串引用上? .NET RegEx“内存泄漏”调查 所以说reg-ex会导致内存开销并且如果你有其他选择则不应该使用它是正确的吗? 是否有任何其他不利于注册(除了它很难学习:)) PS我正在开发一个类似于网络爬虫的应用程序(c#.net),它提取所有href和一些其他信息,如标题,元标记等。我可以选择使用HTML Agility包而不是reg-ex。

RenderTargetBitmap内存泄漏

我试图使用RenderTargetBitmap渲染图像每次我从RenderTargetBitmap创建一个实例来渲染图像时内存增加,当完成时内存永远不会释放,这就是代码: RenderTargetBitmap rtb = new RenderTargetBitmap((int)(renderWidth * dpiX / 96.0), (int)(renderHeight * dpiY / 96.0), dpiX, dpiY, PixelFormats.Pbgra32); DrawingVisual dv = new DrawingVisual(); using (DrawingContext ctx = dv.RenderOpen()) { VisualBrush vb = new VisualBrush(target); ctx.DrawRectangle(vb, null, new System.Windows.Rect(new Point(0, 0), new Point(bounds.Width, bounds.Height))); } rtb.Render(dv); 请我帮忙如何释放内存并感谢所有人。

我如何明确清除字节

我正在创建新的字节数组,这些数组不是由GC收集的,而是存在于内存中并增加了专用字节。 下面的代码每10秒执行一次。 完成后如何明确清除变量? byte[] outputMessage = new byte[10000]; //Do some work here

破坏内存泄漏VS2015。 大规模的本机堆

我正在努力解决内存问题,我可以肯定地看到,但我不知道它究竟发生在何处以及何时发生。 我的托管堆大小似乎没问题(100MB),但是本机堆大小在未知时刻开始增长,它仍然会一直运行,直到它达到~2GB并且应用程序崩溃。 我的应用程序正在运行许multithreading,并且它在很多循环中通过EF 6进行大量的Db连接。 这就是为什么我只是通过查看日志或提供断点来调试代码真的很难。 我想也许我可以通过查看内存来看到问题,但只有我能看到的是我的本机堆大小主要由大小为8,192字节的对象填充。 所以我可以看到问题确实发生了,但仍然不知道为什么。 我不确定我是否使用Visual Studio内存分析器的100%function。 我现在能看到的是: 我还能做些什么来找到这个问题? 也许这是一个愚蠢的问题,但我正在解决这个问题两天,我几乎达到了我的想法限制。 我已经通过了断点,日志,代码分析,但我仍然没有任何线索。 我会感激任何想法。 [编辑] 2017年2月15日15:11 我能够找到负责泄漏的代码,但对我来说仍然没有意义。 这段代码如何导致大量内存泄漏? 代码是: public class DbData : IDisposable { private DBEntity db; public DbData() { db = new FruitDBEntity(); } public Fruit AddFruitDefinition(Fruit fruit) { lock (thisLock) { var newFruit = db.Fruits.Where(f => f.FruitId == fruit.FruitId) .Where(f => f.FruitName […]

OutOfMemoryException,堆栈大小很大,线程数量很大

我正在分析我的.net Windows服务。 我试图发现OutOfMemoryException并发现我的堆栈大小很大并且正在增长,因为线程数量不断增长。 每个线程在Windows x64计算机上获得1024 KB 。 因此,当我的应用程序有754个线程时,堆栈大小将为772 MB 。 对我来说问题是我不知道这些线程来自哪里。 最初我的应用程序的线程数量非常有限,并且随着时间的推移不断增长。 我有两个怀疑 – 这些线程是由WCF或数据库连接创建的。 我的应用程序使用WCF和数据集。 此外,我试图在Ants do Trace中配置我的应用程序,我可以看到大量的System.ServiceModel.Channels.ClientReliableDuplexSessionChannel ,这个数字随着时间的推移而增加。 我可以看到创建了数千个这样的对象。 所以我想知道的是谁创建线程(发现工具,分析器)以及创建这些线程的WCF是谁。 UPDATE 我已经在调试器中停止了我的应用程序来查看线程。 我只能看到大量带有调用堆栈的Win32线程 ntdll.dll!7c82860c() [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] ntdll.dll!7c827d99() kernel32.dll!77e4e02f() mscorwks.dll!79e7c7a8() mscorwks.dll!79f943fe() mscorwks.dll!79f94237() mscorlib.ni.dll!792f5577() mscorlib.ni.dll!792e01c5()

长时间运行的应用程序变慢

有一个由三个可执行文件组成的应用程序。 其中之一 – 调度程序,运行其他可执行文件。 调度程序在完成时从可执行文件接收代码。 也就是说,只有调度程序始终在运行,其他可执行文件会卸载并再次加载。 该应用程序在服务点运行并全天候工作。 在第一次启动时,应用程序运行得很快。 在一天结束时,应用程序运行速度非常慢。 这种行为可能是什么原因?

C#WPF应用程序使用太多内存而GC.GetTotalMemory()为低

我写了两个线程的WPF应用程序 – 主线程是GUI线程,另一个线程是worker。 应用程序有一个带有一些控件的WPF表单。 有一个按钮,允许选择目录。 选择目录后,应用程序将扫描该目录中的.jpg文件,并检查其缩略图是否在哈希表中。 如果它们是,它什么都不做。 否则它将他们的完整文件名添加到工作队列。 Worker正在从这个队列中获取文件名,加载JPEG图像(使用WPF的JpegBitmapDecoder和BitmapFrame),制作它们的缩略图(使用WPF的TransformedBitmap)并将它们添加到哈希表中。 一切正常,除了这个应用程序在为大图像(如5000×5000像素)制作缩略图时的内存消耗。 我在我的表单上添加了文本框以显示内存消耗(GC.GetTotalMemory()和Process.GetCurrentProcess()。PrivateMemorySize64)并且非常惊讶,因为GC.GetTotalMemory()保持接近1-2 MB,而私有内存大小不断增长,特别是在加载新图像时(每张图像约+ 100Mb)。 即使在加载所有图像,制作它们的缩略图并释放原始图像之后,私有内存大小仍保持在~700-800Mbytes。 我的VirtualBox仅限于512Mb的物理内存,VirtualBox中的Windows开始交换很多来处理这种巨大的内存消耗。 我想我做错了什么,但我不知道如何调查这个问题,根据GC的说法,分配的内存大小非常低。 附加缩略图加载器类的代码: class ThumbnailLoader { Hashtable thumbnails; Queue taskqueue; EventWaitHandle wh; Thread[] workers; bool stop; object locker; int width, height, processed, added; public ThumbnailLoader() { int workercount,i; wh = new AutoResetEvent(false); thumbnails = new Hashtable(); taskqueue = new Queue(); stop […]

异步加载BitmapSource映像时内存泄漏

我有一些我正在加载到WPF应用程序中的ListBox中的图像。 最初我使用GDI来调整图像大小(原件占用的内存太多)。 这很好,除了他们每张图片大约需要400毫秒。 不太好。 因此,在寻找另一种解决方案时,我发现了一种使用TransformedBitmap(inheritance自BitmapSource)的方法。 那很好,我想,我可以用它。 除了我现在正在某处发生内存泄漏…… 我正在使用BackgroundWorker异步加载图像,如下所示: BitmapSource bs = ImageUtils.ResizeBitmapSource(ImageUtils.GetImageSource(photo.FullName)); //BitmapSource bs = ImageUtils.GetImageSource(photo.FullName); bs.Freeze(); this.dispatcher.Invoke(new Action(() => { photo.Source = bs; })); GetImageSource只从路径获取Bitmap,然后转换为BitmapSource。 这是ResizeBitmapSource的代码片段: const int thumbnailSize = 200; int width; int height; if (bs.Width > bs.Height) { width = thumbnailSize; height = (int)(bs.Height * thumbnailSize / bs.Width); } else { height […]

GetOracleDecimal内存泄漏

@GilShalit 一年前发表评论 : “好吧,我们在GetOracleDecimal中对内存泄漏(我们提供给客户的代码)进行了一年多的打击后,我们已经开始不信任ODP(.Net 2.0)了……祝你好运!” – GilShalit 09年8月27日12:44 你是怎么解决的? 我们有一个服务,每隔几分钟查询一次没有释放内存的Oracle数据库; 在使用WinDbg进行一些调查之后,我发现这个类型正在最终化队列中堆积:Oracle.DataAccess.Types.OpoDecCtx。 以下是我认为问题的界限: decimal volume = (decimal)OracleDecimal.SetPrecision(reader.GetOracleDecimal(5), 28); 我评论了这一点,内存泄漏消失了。 任何想法将不胜感激 – 谢谢!

线程内存泄漏

我试图在更大的C#程序中追踪内存泄漏,该程序产生多个线程。 在这个过程中,我创建了一个小方程序,我用它来测试一些基本的东西,我发现了一些我真的不明白的行为。 class Program { static void test() { } static void Main(string[] args) { while (true) { Thread test_thread = new Thread(() => test()); test_thread.Start(); Thread.Sleep(20); } } } 运行这个程序,我看到程序的内存使用量稳步增加而不会停止。 在短短几分钟内,内存使用量超过100MB并继续攀升。 如果我注释掉test_thread.Start();行,那么程序使用的内存最大可以达到几兆字节,并且会升级。 我还尝试使用GC.Collect()在while循环结束时强制进行垃圾收集,但它似乎没有做任何事情。 我认为一旦函数完成执行允许GC将其拖拽,线程就会被取消引用,但这似乎并没有发生。 我不能在这里深入了解一些事情,我会很感激帮助解决这个问题。 提前致谢!