2010-03-10 54 views
4

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

感谢,

约翰

+2

请定义“中断”。你的意思是线程暂停或你得到一个'InterruptedException'? – 2010-03-10 18:31:52

+0

在这种情况下,线程得到一个InterruptedException。 – 2010-03-10 19:25:07

回答

11

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

+0

'OutOfMemoryError'实际上。 – 2010-03-10 19:57:49

+0

@Thomas:谢谢,修正。 – 2010-03-10 20:37:21

2

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

0

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

+0

完全相反 - 线程被唤醒*没有* InterruptedException,并且没有满足等待条件。 – 2012-02-25 23:32:22

+0

@HotLicks在其中一条评论中,原作者声明“在这种情况下,线程会得到InterruptedException。”。所以他的情况确实适合虚假的中断场景。 – 2012-02-26 10:47:31

+0

@Michał我很感激你继续为此研究解决方案。但是你链接的文档谈到了“虚假唤醒”,而不是中断。在我的情况下,中断不是垃圾收集器,它是另一个线程在得到OutOfMemoryError后尝试清理。我很确定最初接受的答案是正确的。 – 2012-02-26 13:24:30