谁杀了My Java Infinite循环线程?

Che*_*hen 4 java multithreading jvm memory-management 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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

一些可能有用的信息:

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

Jan*_*Jan 9

OutOfMemoryError不是Exception.这是一个源自Throwable的错误.

如果那个被扔到你的某个地方consume(topic, handler),最后仍然会被调用,延迟不可避免的大约30秒......但之后错误将向上传递,你的循环将被终止.