谁杀了My Java Infinite循环线程?

时间:2015-11-26 10:47:50

标签: java multithreading memory-management jvm kafka-consumer-api

正如标题所示,我在while(true)无限循环中包含了一些代码,所有这些代码都被trycatch块完全捕获。这个线程是在main方法中启动的,但是,经过长时间的运行,当我使用jstack检查并导致工作累积时,这个工作线程会神秘地消失。

以下是我的代码:

public void run() {
    while (true) {
        try {
            // Consumer consumes from Kafka server
            Global.KAFKA_METRIC_DATA_CONSUMER.consume(topic, handler);
        } catch (Exception e) {
            logger.error("Kafka consumer process was interrupted by exception!");
        } finally {
            try {
                // Prevent restart too often
                Thread.sleep(30 * BaseConst.SECOND);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

根据我的理解,这个结构将保持线程运行,因此是消费者。即使consume()方法失败,它也会无限重启。但是,正如我上面提到的,整个线程无声地消失,没有任何错误日志。有人能提供一些线索吗?

可能有用的更多信息:

  1. 我检查过消费方法永远不会关闭消费者 也不要关闭服务器的套接字。它会不断尝试 失败后连接服务器。
  2. 我分析了java堆转储,我发现存在内存泄漏 在项目的其他地方,导致内存占用极其严重 高和gc经常。但是,主要方法仍然是 运行

3 个答案:

答案 0 :(得分:9)

OutOfMemoryError不是例外。这是一个源自Throwable的错误。

如果在consume(topic, handler)的某个地方抛出了它,最后仍会被调用,延迟不可避免的大约30秒......但在此之后错误将向上传递并且你的循环将被终止。

答案 1 :(得分:1)

您正在抓住Exception,因此可能会抛出java.lang.Errorjava.lang.Throwable(例如OutOfMemoryError

如果你真的想抓住所有东西,你需要抓住Throwable而不仅仅是Exception子类。

答案 2 :(得分:0)

您的帖子可能因错误而被杀死。

错误也不例外!但它们都延伸Throwable

添加另一个捕获错误的catch块。

永远不应该抓住Throwable,因为错误需要与异常不同的处理