如果您有线程并且该线程导致一些可能的内存泄漏,那么如果您杀死该线程,是否将释放所有内存?我想了解清理工作如何进行?
答案 0 :(得分:1)
...并且该线程导致一些可能的内存泄漏
非常广泛且不精确。
如果您杀死线程,是否将释放所有内存?
取决于。我可以想到一些杀死线程无济于事的例外情况:
static
链接泄漏内存时因此,它永远不是一种可靠的方法。编写精确而健壮的代码,这样您就不必诉诸于此。
答案 1 :(得分:1)
如果您采取Thread.Abort()
的意义杀死线程,则几乎是在说:“此过程非常糟糕,以至于我要摆脱它的痛苦”,在这种情况下,它< em>真的没关系什么是内存语义。杀死线程是非常不好的事情,并且可能违反我们在代码行为方式方面考虑的许多事情。
但是:就内存的行为而言;线程(尤其是:堆栈的活动部分,以及任何线程静态值/线程插槽)是许多“根”之一。杀死线程将在逻辑上删除一个根,因此,如果某些东西仅是 活着,因为它可以直接或间接地从堆栈框架/线程访问,那么下一次 GC将运行该线程的statics / thread-slots,则有资格进行收集。当然,以这种方式杀死线程实际上可能会增加问题,尤其是对于非托管代码-因为它可以停止using
/ Dispose()
代码正常工作,这意味着可能需要更多终结器需要运行。堆栈空间本身也可能是可恢复的,但是在宏大的方案中,这对我来说可以忽略不计-进程可能希望保留它,因为您可能想要另一个线程。
再次:强调,不要杀死线程。如果您可以在某处设置信号,让他们定期检查并放松自己,那么:很好。