Tag: 内存泄漏

.NET Framework – 可能的内存泄漏类?

就在前几天,我正在调查内存泄漏,该应用程序在两分钟内将应用程序从大约50MB膨胀到大约130MB。 事实certificate问题出在ConcurrentQueue类。 在内部,类存储数组的链接列表。 当一个项目从ConcurrentQueue出队时,数组中的索引会被碰撞,但该项目仍保留在数组中(即它未设置为null)。 在足够的入队/出队之后,整个arrays节点被丢弃,因此从技术上讲它不是泄漏 ,但如果在ConcurrentQueue中放置大对象,这可能会很快失控。 文档没有记录这种危险。 我想知道基类库中还有其他潜在的内存缺陷吗? 我知道Substring one(也就是说,如果你调用substring并保持结果,整个字符串仍将在内存中)。 你遇到过的其他人吗?

来自队列的大对象堆和字符串对象

我有一个Windows控制台应用程序应该运行几天和几个月没有重新启动。 该应用程序从MSMQ检索“工作”并处理它。 有30个线程同时处理工作块。 来自MSMQ的每个工作块大约为200kb,其中大部分工作块分配在单个String对象中。 我注意到,在处理了大约3-4千个这些工作块之后,应用程序的内存消耗非常高,消耗了1到1.5 GB的内存。 我通过分析器运行应用程序并注意到大部分内存(可能是一个演出)在大对象堆中未使用但结构是分段的。 我发现这些未使用的(垃圾收集)字节中有90%是先前分配的字符串。 我开始怀疑从MSMQ进来的字符串是分配,使用然后解除分配,因此是碎片的原因。 我明白像GC.Collect(2或GC.Max …)这样的东西不会有用,因为它们是gc大对象堆但不压缩它(这是问题)。 所以我认为我需要的是缓存这些字符串并以某种方式重用它们,但由于字符串是不可变的,我将不得不使用StringBuilders。 我的问题是:无论如何不改变底层结构(即使用MSMQ,因为这是我无法改变的),并且仍然避免每次初始化一个新的String以避免分裂LOH? 谢谢,雅尼斯 更新:关于如何检索这些“工作”块 目前,它们作为WorkChunk对象存储在MSMQ中。 这些对象中的每一个都包含一个名为Contents的String和另一个名为Headers的String。 这些是实际的文本数据。 如果需要,我可以将存储结构更改为其他内容,如果需要,可以将底层存储机制更改为MSMQ以外的其他内容。 目前我们在工作节点方面 WorkChunk chunk = _Queue.Receive(); 所以在这个阶段我们几乎无法缓存。 如果我们以某种方式改变了结构,那么我想我们可以做一些进步。 在任何情况下,我们都必须解决这个问题,以便我们尽一切可能避免浪费数月的工作。 更新:我继续尝试下面的一些建议并注意到这个问题无法在我的本地计算机上运行(运行Windows 7 x64和64位应用程序)。 这使得事情变得更加困难 – 如果有人知道为什么那么它真的有助于在本地重新调整这个问题。

如何解决私有字节(本机内存)泄漏?

我正在开发一个似乎有漏洞的C#应用​​程序。 我用过内存分析器,发现我的 私有字节不断增加,但所有堆中的 字节数不会增加,这意味着它可能是本机内存泄漏 现在我卡住了,如何在本机代码中发现内存泄漏?

监控应用程序内存使用情况的正确方法是什么?

出于调试目的,我编写了这个小静态方法: public static long CheckMemory(long maxMemorySizeBytes) { GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); var usedMemoryBytes = Process.GetCurrentProcess().VirtualMemorySize64; if (usedMemoryBytes > maxMemorySizeBytes) Debugger.Break(); return usedMemoryBytes; } 出于某种原因, VirtualMemorySize64不断返回比Visual Studio Diagnostic Tools窗口显示的内存更多的内存,以及任务管理器显示的内容。 对于我现在正在运行的具体示例,以下是数字: 诊断工具:~250 MB 任务管理器:~120 MB VirtualMemorySize64:~1100 MB 为什么会出现如此大的差异,如何从应用程序本身内正确跟踪内存使用情况?

发现内存泄漏

我有一个Web应用程序,我使用很多不同的第三方组件,CMS,当然还有我的代码。 由于某种原因,我失去了内存exception。 脚本抛出exception:内存不足 我试图找出发生了什么。 这是我发现的: 我用50个线程运行测试来调用我的web应用程序的15页。 记忆似乎很好。 IIS进程仅使用400 MB的RAM 我在web.config中添加了一个空格,突然间我的IIS进程在30分钟内开始增长到超过GB。 Visual Studio无法拍摄我的内存快照,因为它太大了(真的吗?!)所以我安装了ANTS内存分析器,但它说我的应用程序只使用了大约300 MB IIS进程需要1 GB pY.png 几分钟后我停止了测试,但内存没有释放。 (ANTS探测器停止工作,所以我重新启动它) 它似乎并不是应用程序特别使用100-200MB内存,我正在为我的控制器使用输出缓存。 我不明白的是,为什么IIS消耗的内存一直在增长,哪些是错的 更新 我的应用程序已自动重启,W3WP崩溃导致IIS释放内存,而我的压力没有运行一段时间: 应用程序:w3wp.exe Framework版本:v4.0.30319描述:由于.NET运行时在IP 5A3A86F1(5A0F0000)中出现内部错误,退出代码为80131506,该进程已终止。 和 错误应用程序名称:w3wp.exe,版本:10.0.15063.0,时间戳:0xacce422f错误模块名称:clr.dll,版本:4.7.2098.0,时间戳:0x59028d36exception代码:0xc0000005错误偏移量:0x002b86f1错误进程id:0x50a4错误应用程序启动时间:0x01d2ee688f323893错误应用程序路径:C:\ WINDOWS \ SysWOW64 \ inetsrv \ w3wp.exe错误模块路径:C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ clr.dll报告ID:4362ddc5-f8d7- 4441-8916-3830f9268b3a错误包全名:错误包相关申请ID: 更新2 我运行DebugDiag并且我已经对网站进行了压力测试,直到它消耗了大约3.5 GB的RAM。 Chakra是微软的图书馆。 所以现在我有2个问题。 是ChakraCore有泄漏还是正在使用/分配它? 如何定义哪个库? 2-它说27,000个分配。 这是否意味着内存中仍有27,000个或者其中一些可能被分配然后处理? 3-它仍然没有告诉我任何有关3GB消耗RAM的剩余部分。 它我总共只有600 […]

如何研究.NET中的非托管内存泄漏?

我有一个在MSMQ上运行的WCF服务。 内存随着时间的推移逐渐增加,表明存在某种内存泄漏。 我在本地运行该服务并使用PerfMon监控一些计数器。 总CLR内存管理堆字节保持相对恒定,而进程的私有字节随时间增加。 这让我相信存在某种非托管内存泄漏。 假设非托管内存泄漏是问题,我该如何解决这个问题? 是否有任何工具可以用来向我提供有关导致非托管内存泄漏的提示? 此外,我的所有服务都是从事务队列中读取并写入数据库,所有这些都是DTC事务的一部分(通过要求服务合同上的事务来处理)。 我没有明确地使用COM或DllImports做任何事情。 提前致谢!

简单的WPF示例导致不受控制的内存增长

我已经将我在其中一个应用程序中看到的一个问题归结为一个非常简单的复制样本。 我需要知道是否有什么不对劲或者我缺少的东西。 无论如何,下面是代码。 行为是代码在内存中运行并稳定增长,直到它与OutOfMemoryException崩溃。 这需要一段时间,但行为是对象被分配,而不是垃圾收集。 我已经采取内存转储并运行!gcroot对某些事情以及使用ANTS来弄清楚问题是什么,但我已经有一段时间了,需要一些新的眼睛。 此复制示例是一个简单的控制台应用程序,它创建一个Canvas并为其添加一行。 它不断地这样做。 这就是所有代码所做的。 它不时地睡觉以确保CPU不会因为你的系统没有响应而被征税(并且确保GC无法运行并不奇怪)。 有人有什么想法? 我已经尝试过仅使用.NET 3.0,.NET 3.5以及.NET 3.5 SP1,并且在所有三种环境中都会出现相同的行为。 另请注意,我已将此代码放在WPF应用程序项目中,并在单击按钮时触发代码,它也会出现在那里。 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用System.Text; 使用System.Windows.Controls; 使用System.Windows.Shapes; 使用System.Windows; 命名空间SimplestReproSample { 课程 { [STAThread] static void Main(string [] args) { long count = 0; 而(真) { if(count ++%100 == 0) { //睡一会儿,以确保我们不会耗尽整个CPU System.Threading.Thread.Sleep(50); } BuildCanvas(); } } [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private static […]

内存泄漏更改Windows Phone 7中的图像

当我在Windows Phone 7.5中多次更改图像容器的图像时,我遇到了问题 这是错误的代码: public void displayImages() { image1.Source = new System.Windows.Media.Imaging.BitmapImage (new Uri(“BrainImg/axis/” + axis + currentSlice + “.jpg”, UriKind.RelativeOrAbsolute)); image2.Source = new System.Windows.Media.Imaging.BitmapImage (new Uri(“BrainImg/aseg/” + axis + currentSlice + “.png”, UriKind.RelativeOrAbsolute)); } private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { // do something if (this.slider1 != null) { currentSlice = (int) this.slider1.Value; displayImages(); […]

WeakReference Bug?

[TestMethod] public void Memory() { var wr = new WeakReference(“aaabbb”); Assert.IsTrue(wr.IsAlive); GC.Collect(); GC.Collect(); GC.Collect(); GC.Collect(); GC.Collect(); Assert.IsFalse(wr.IsAlive); //<– fails here } 它是.NET 3.5 SP1 任何人都可以告诉我为什么这个测试失败了? 编辑 :谢谢stusmith 你有一个字符串的引用,因为它是一个常量,可能是实例(即没有动态分配),永远不会被收集。 就是这样。 将第一行更改为 var wr = new WeakReference(new object()); 并且测试通过:-)

ToolStrip内存泄漏

我一直在使用SWF-ToolStrip解决内存泄漏问题。 根据这个http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=115600#已经解决了。 但这里看起来并非如此。 有谁知道如何解决这个问题?