【发布时间】:2011-09-13 22:54:52
【问题描述】:
我有一个用 C#.Net 编写的 Windows 服务。服务启动后,我生成了一个新线程,如下所示
new Thread(new ThreadStart(Function1)).Start();
此线程无限循环并执行我的服务预期的职责。每天一次,我需要同时执行一个不同的操作,我的线程为此生成第二个线程,如下所示
new Thread(new ThreadStart(Function2)).Start();
第二个线程执行一个非常简单的功能。它使用 FileReadAllLines 读取文本文件的所有行,快速处理这些信息并退出。
我的问题是读取文件的第二个线程使用的内存没有被收集。我让我的服务运行了 3 个小时,希望能调用 GC,但什么也没发生,任务管理器仍然显示我的服务正在使用 150mb 的内存。读取和处理文本文件的函数是一个非常简单的函数,我确信没有对包含文本的字符串数组的隐藏引用。有人可以解释为什么会这样吗?是否有可能由另一个生成的线程生成的线程无法自行清理?
谢谢
【问题讨论】:
-
我认为实际查看在第二个线程上运行的代码会有所帮助。
-
您的第二个线程是否正确处理了用于读取文件的流?
-
你怎么知道你有泄漏。众所周知,从任务管理器中读取数字很容易出错。除非您真正了解 Windows 内存管理和 .net 内存管理的工作原理,否则您会误解这些数字。
-
这个问题很难理解,但我建议你使用 ThreadPool 而不是手动创建新线程或使用 System.Threading.Timer - WinServices 中通常会安排一些后台工作。
-
“使用 150 兆内存”字面意思是毫无意义。是您正在使用地址空间的“内存”吗?如果是,有多少是共享的?在未共享的工作集中,分配了多少,提交了多少,有多少在物理内存而不是页面文件中?在您知道所有这些问题的答案之前,分析内存使用情况是没有意义的。但坦率地说,150 兆是很小,你可能不应该担心它。你能解释一下你为什么关心吗?另外,不要使用任务管理器。使用内存分析器来分析内存使用情况,这就是它的用途。
标签: c# multithreading memory-management