C#线程不释放内存我有一个用C#.Net写的windows服务。当服务启动时,我会生成一个新线程,例如newThread(newThreadStart(Function1)).Start();该线程无限循环并执行我的服务期望的职责。一天一次,我需要同时执行不同的操作,我的线程会生成第二个线程,就像这样newThread(newThreadStart(Function2)).Start();第二个线程执行一个非常简单的函数。它使用FileReadAllLines读取文本文件的所有行,快速处理此信息并退出。我的问题是读取文件的第二个线程使用的内存没有被收集。我让我的服务运行了3个小时,希望调用GC但没有任何反应,任务管理器仍然显示我的服务正在使用150mb内存。读取和处理文本文件的函数非常简单,我确信没有对包含文本的字符串数组的隐藏引用。有人可以解释为什么会这样吗?是否有可能由另一个生成的线程生成的线程无法自行清理?谢谢如果您正在使用Windows任务管理器尝试计算使用的内存,它可能会欺骗您。据我所知,CLR使用的内存通常不会返回给操作系统...因此您可能仍然会看到一个高工作集,即使大部分内存仍然可以在进程内部重用。如果您让服务运行一周,您会看到内存使用量在整个一周内稳步攀升,还是在第一天增加然后趋于平稳?如果是这样,您肯定认为这是一个问题吗?如果是这样,您可能需要将第二个任务放在一个单独的进程中。相信垃圾收集器,别担心。150兆不是。您甚至没有测量文件的大小;其中大部分是代码。如果您担心内存的来源,请先了解内存在现代操作系统中的工作原理。在开始抛出“150兆已分配内存”之类的数字之前,您需要了解虚拟内存和物理内存之间的区别、提交内存和分配内存之间的区别,以及所有这些。请记住,在32位进程中,您有2000兆的虚拟地址空间;我不认为150兆进程有那么大。正如Jon所说,您要关注的是私有字节的缓慢稳定增长。如果那没有发生,那么你就没有内存泄漏。让垃圾收集器完成它的工作,不要担心。如果您仍然担心GoodHeaven,请不要使用任务管理器。获取内存分析器并学习如何使用它。任务管理人员从30,000英尺的高空俯视他们来检查流程。您需要使用显微镜而不是望远镜来分析该过程如何释放单个文件字节。以上就是C#学习教程的全部内容:C#线程不释放共享内存。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
