.net 如何管理线程的内存?

.net 如何管理线程的内存?,.net,multithreading,garbage-collection,memory-fragmentation,.net,Multithreading,Garbage Collection,Memory Fragmentation,我知道.net线程非常重,每个线程消耗约1MB内存(主要用于堆栈)。现在,如果这是一个user.net类,我知道它可能会将大部分内存放在LOH中。然而,由于它是一个核心类,我想知道它的行为是什么 出现这个问题的原因是因为我目前正在对一个(可能存在很长时间的)应用程序进行内存分析,而且似乎有一个缓慢的泄漏。我注意到VS显示了33个线程(在各种状态下,包括停止)。我想知道线程的节约使用是否会导致内存碎片化(以及一些LOH DTO)。线程的堆栈没有存储在LOH上,因为堆栈不是CLR对象。当.NET请求

我知道.net线程非常重,每个线程消耗约1MB内存(主要用于堆栈)。现在,如果这是一个user.net类,我知道它可能会将大部分内存放在LOH中。然而,由于它是一个核心类,我想知道它的行为是什么


出现这个问题的原因是因为我目前正在对一个(可能存在很长时间的)应用程序进行内存分析,而且似乎有一个缓慢的泄漏。我注意到VS显示了33个线程(在各种状态下,包括停止)。我想知道线程的节约使用是否会导致内存碎片化(以及一些LOH DTO)。

线程的堆栈没有存储在LOH上,因为堆栈不是CLR对象。当.NET请求新线程时,操作系统会分配线程堆栈

CLR线程是操作系统线程的薄包装


如果确实存在内存泄漏,可以确定它不在线程对象本身中。

如何分析?你在用什么工具?这听起来像是猜测。。。猜测不是调试内存泄漏的方法。如果你有一个探查器,用它来探查-泄漏的来源应该没有歧义(如果它存在的话)。@J。。。我知道。这是猜测,因此我想了解更多信息。我没有说我将源代码标识为线程,我是在问它是否是因为线程。至于分析,我使用的是Ants7。这并没有给我任何关于线程内存使用的信息,当然有。实例保留应该向您显示任何根目录。您是否使用任何本机代码(外部DLL等?)。这是C#还是VB.NET或其他什么?老实说,我根本不关心实例保留。问题在于内存碎片,而不是实例保留。事实上,如果我所问的得到证实,并且线程堆栈被放置在LOH上,那么实际上,适当的实例生命周期管理会加剧这种情况。但是,我知道线程是由线程池处理的。J无意冒犯,但这不是一个普通的性能问题,而是关于深入理解线程池如何与GC交互的问题。听起来您正在尝试解决一个我们甚至不确定是否存在的缓慢内存泄漏问题-开始的问题听起来好像您随机指出内存碎片是导致缓慢内存“泄漏”的可能原因。如果这不是关于内存泄漏,那么为什么要提到它?如果确实存在问题,那么由托管对象(线程或其他)导致的碎片极不可能是原因。