Java服务假死,如何诊断无响应问题?
问题描述
某服务下所有 URL 请求(包括无效 URL)均无法响应,表现为浏览器持续加载状态。初步排除系统内存、GC 情况等问题。线程堆栈信息过长,无法在此展示。日志中未发现异常。
诊断与解决方案
立即学习“Java免费学习笔记(深入)”;
从问题描述中,可以推测服务已经接收到了请求,但未将其处理。可能是由于某些异常导致服务中处理请求的线程异常退出,从而导致整个服务无法响应。
根据所提供的线程堆栈信息链接(已无法访问),可以发现问题根源在于 Poller 线程。Poller 线程是一个死循环,正常情况下,只有在 tomcat 关闭时才会退出循环。问题中的情况则表明 Poller 线程在其他异常情况下也退出了循环,导致处理请求的 I/O 无法完成,进而使得服务假死。
检查服务中的代码,找到导致 Poller 线程退出的异常点,并进行修复。在问题中,可能是由于 OOM 导致的异常,建议排查并解决内存泄漏或其他内存问题。