首页 > 解决方案 > 杀死线程后的内存分配如何?

问题描述

如果您有一个线程并且该线程可能导致一些内存泄漏,如果您杀死该线程,是否会释放所有内存?我想了解清理工作是如何进行的?

标签: .netmultithreadinggarbage-collection

解决方案


如果您在某种意义上诉诸于杀死一个线程Thread.Abort(),那么您几乎是在说“这个过程病得很厉害,我要把它从痛苦中解脱出来”,在这种情况下,内存语义实际上并不重要是。杀死线程是一件非常糟糕的事情,并且可能违反我们在代码行为方面考虑的大量事情。

但是:就记忆的行为而言;线程(特别是:堆栈的活动部分,以及任何线程静态值/线程槽)是多种“根”之一。杀死一个线程将在逻辑上删除一个根,因此下次GC 运行时,如果某些东西只是因为可以从该线程的堆栈帧/线程静态/线程槽直接或间接访问而存活,那么它将是合格的供收藏。当然,以这种方式杀死线程实际上可能会增加问题,尤其是对于非托管代码 - 因为它可以停止using/Dispose()代码正常工作,这意味着可能需要运行更多终结器。堆栈空间本身也可能是可恢复的,但从总体上看,这对我来说是微不足道的 - 并且该过程可能希望在您可能需要另一个线程的基础上保持它。

再次强调:不要杀死线程。如果你可以在某个地方设置一个信号,让他们定期检查并放松自己,那么:很好。


推荐阅读