Tag: 内存管理

C#线程不释放内存

我有一个用C#.Net编写的Windows服务。 当服务启动时,我生成一个新线程,如下所示 new Thread(new ThreadStart(Function1)).Start(); 这个线程无限循环并执行我的服务所期望的职责。 每天一次,我需要同时执行一个不同的操作,我的线程会生成第二个线程,如下所示 new Thread(new ThreadStart(Function2)).Start(); 第二个线程执行一个非常简单的function。 它使用FileReadAllLines读取文本文件的所有行,快速处理此信息并退出。 我的问题是没有收集读取文件的第二个线程使用的内存。 我让我的服务运行了3个小时,希望调用GC但没有任何反应,任务管理器仍然显示我的服务正在使用150mb的内存。 读取和处理文本文件的函数非常简单,我确信没有对包含文本的字符串数组的隐藏引用。 有人可以解释为什么会这样吗? 是否有可能由另一个衍生线程生成的线程无法自行清理? 谢谢

如何在.Net中列出堆中的所有托管对象?

是否可以列出存储在堆中的所有对象。 我想做这样的事情: IEnumerable listOfObjectsInHeap = GetListOfObjectsFromHeap();

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

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

显式事件添加/删除,误解?

我最近一直在研究内存管理,并一直在研究如何管理事件,现在,我看到了事件订阅的显式添加/删除语法。 我认为这很简单,添加/删除只允许我在订阅和取消订阅时执行其他逻辑? 我得到它了,还是有更多的东西? 此外,虽然我在这里,任何清理我的事件处理的建议/最佳实践。

使用EmptyWorkingSet有什么副作用?

我正在使用下面的代码释放一些正在运行的程序的内存,因为我自己的程序需要大量内存资源才能更快地运行。 [DllImport(“psapi.dll”)] public static extern bool EmptyWorkingSet(IntPtr hProcess); public FreeMem(string programName){ EmptyWorkingSet(Process.GetCurrentProcess().Handle); foreach(Process process in Process.GetProcesses(programName)) { try { EmptyWorkingSet(process.Handle); } catch (Exception) { … } } } 它看起来工作正常,我能够将某些程序(如资源管理器)的内存使用量从100,000 Kb降低到2,000 Kb。 这很不错,但这样做有副作用吗? 一些商业软件也使用这个,如Yamicsoft Vista / Xp管理器和Firefox优化器,仅举几例,所以我在想,如果这没有不良副作用或存在?

我是否需要在每个’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); […]

我如何在C#中释放对象

谁能告诉我如何在C#中释放对象? 例如,我有一个对象: Object obj1 = new Object(); //Some code using obj1 /* Here I would like to free obj1, after it is no longer required and also more importantly its scope is the full run time of the program. */ 感谢你的帮助

在Perf Mon中看到“%GC时间”的原因

在Perf Mon中监控我们的应用程序时,我注意到GC的时间百分比在20-60%之间,而我们的应用程序执行长时间运行的过程(在30秒到1.5分钟之间变化)。 这对我来说似乎有些过分。 这提出了两个重要问题。 我纠正这个过分吗? 我可以采取的路线来弄清楚为什么GC会发生这么多?

.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 […]

.NET中的内存管理

有没有人在c#中有关于内存管理的指南,书籍或文章? 我想改进我的内存管理信息?