【问题标题】:Will Java's garbage collector interrupt a thread?Java 的垃圾收集器会中断线程吗?
【发布时间】:2010-03-10 18:29:32
【问题描述】:

某些东西正在中断我的应用程序中的线程。当 JVM 接近用完堆空间时,它似乎会发生。我可以为 JVM 配置额外的堆,但我很好奇垃圾收集器是否正在中断线程以试图回收内存。有人知道吗?我在 RedHat ES 5.2 上使用 64 位 Java 1.6.0_16。

谢谢,

约翰

【问题讨论】:

  • 请定义“中断”。你的意思是线程暂停还是收到InterruptedException
  • 在这种情况下,线程会得到一个 InterruptedException。

标签: java garbage-collection


【解决方案1】:

在 throw InterruptedException 中的中断?不,那不应该发生。它可能需要暂停线程本身,但这不是一回事。如果虚拟机完全耗尽内存,它应该抛出OutOfMemoryError...

【讨论】:

    【解决方案2】:

    除非发生 OutOfMemory,否则如果发生垃圾回收,线程不会被中断。他们可能会进入等待状态一段时间。

    【讨论】:

      【解决方案3】:

      您可能会收到所谓的spurious interrupts。它们可能随时发生,但低内存/高负载情况可能使它们更有可能发生。但是,这将取决于 JVM 的实现细节,这不是一个规则,并且与垃圾收集(如果确实有的话)的相关性是偶然的,而不是设计使然。

      【讨论】:

      • 这完全相反——一个线程被唤醒没有一个InterruptedException,也没有满足等待条件。
      • @HotLicks 在其中一个 cmets 中,原作者声明“在这种情况下,线程会得到一个 InterruptedException。”。所以他的情况确实符合虚假中断的情况。
      • @Michał 感谢您继续为此研究解决方案。但是您链接的文档谈论的是“虚假唤醒”,而不是中断。在我的情况下,中断不是垃圾收集器,而是另一个线程在收到 OutOfMemoryError 后试图清理。我很确定最初接受的答案是正确的。
      • @MichałKosmulski -- 正如约翰所说,引用的文章没有提到“虚假中断”,而是谈到了“虚假唤醒”,其中不满足等待条件但 wait 操作仍然返回。
      • @HotLicks 看起来你是对的,我混淆了两件事。虚假唤醒确实导致 wait() 简单地返回,而不是抛出 InterruptedException。真丢脸。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 2011-11-07
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      相关资源
      最近更新 更多