杀死线程后如何分配内存?

时间:2019-06-28 05:26:16

标签: .net multithreading garbage-collection

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

2 个答案:

答案 0 :(得分:1)

  

...并且该线程导致一些可能的内存泄漏

非常广泛且不精确。

  

如果您杀死线程,是否将释放所有内存?

取决于。我可以想到一些杀死线程无济于事的例外情况:

  • 当您通过某个地方的static链接泄漏内存时
  • 当线程分配非托管内存时

因此,它永远不是一种可靠的方法。编写精确而健壮的代码,这样您就不必诉诸于此。

答案 1 :(得分:1)

如果您采取Thread.Abort()的意义杀死线程,则几乎是在说:“此过程非常糟糕,以至于我要摆脱它的痛苦”,在这种情况下,它< em>真的没关系什么是内存语义。杀死线程是非常不好的事情,并且可能违反我们在代码行为方式方面考虑的许多事情。

但是:就内存的行为而言;线程(尤其是:堆栈的活动部分,以及任何线程静态值/线程插槽)是许多“根”之一。杀死线程将在逻辑上删除一个根,因此,如果某些东西仅是 活着,因为它可以直接或间接地从堆栈框架/线程访问,那么下一次 GC将运行该线程的statics / thread-slots,则有资格进行收集。当然,以这种方式杀死线程实际上可能会增加问题,尤其是对于非托管代码-因为它可以停止using / Dispose()代码正常工作,这意味着可能需要更多终结器需要运行。堆栈空间本身也可能是可恢复的,但是在宏大的方案中,这对我来说可以忽略不计-进程可能希望保留它,因为您可能想要另一个线程。

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