【发布时间】:2016-02-29 10:20:57
【问题描述】:
正如标题所暗示的,我有一些代码包裹在while(true) 无限循环中,并且它们都被try 和catch 块完全捕获。这个线程是在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() 方法失败,它也会无限重启。但是,正如我上面提到的,整个线程无声无息地消失,没有任何错误日志。谁能提供一些线索吗?
更多可能有用的信息:
- 我已经检查了消费方法永远不会关闭消费者 也不关闭到服务器的套接字。它会不断尝试 失败后连接服务器。
- 我分析了java heap dump,发现有内存泄漏 项目中的其他地方,导致内存占用极大 高和 gc 经常。但是,主要方法仍然是 正在运行。
【问题讨论】:
-
你不应该直接使用
Thread;改用ExecutorService(在你的情况下甚至可能是ScheduledExecutorService)。此外,捕获Exception通常是个坏主意——您甚至捕获所有RuntimeException。但是......你没有抓住Errors。这里可能发生的是你触发了一个OutOfMemoryError,它触发了循环结束。更一般地,您应该审查您的设计。 -
另外,你可以使用
TimeUnit.SECONDS.sleep(30L),而不是Thread.sleep();但无论如何都要使用ScheduledExecutorService。
标签: java multithreading memory-management jvm kafka-consumer-api