【问题标题】:How is the memory allocation after killing a thread?杀死线程后的内存分配如何?
【发布时间】:2019-06-28 05:26:16
【问题描述】:

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

【问题讨论】:

  • 用这么少的信息无法最终回答这个问题。 可能该内存符合收集条件,但它取决于。我们必须更详细地了解线程正在做什么以及如何才能做出类似正确答案的任何事情。您应该针对您的软件运行内存分析器并查看内存被保存在哪里。
  • 请注意,最终是 进程 拥有内存,除非内存是由与该线程相关联的引用专门持有的,例如局部变量、线程静态字段等,然后杀死线程实际上不会释放任何东西。

标签: .net multithreading garbage-collection


【解决方案1】:

如果你在Thread.Abort() 的意义上使用杀死一个线程,你几乎是在说“这个过程太糟糕了,我要把它从痛苦中解脱出来”,在这种情况下它 内存语义是什么真的无关紧要。杀死一个线程是一件非常糟糕的事情,并且可能违反我们在代码行为方面考虑的大量事情。

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

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

【讨论】:

    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2019-12-19
    • 2010-10-10
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多