我们有一个 RESTful Web 服务(Java,托管在 Tomcat 中)。有时它会失败(不是每周)。当它失败时,Java CPU 消耗达到 100% 并占用所有可用内存。它不会自行完成。我必须重新启动服务器。
Tomcat 访问日志中没有任何可疑之处。我猜我们的一个用户可能会提交一个非常“繁重”的请求,从而导致服务器停机。这个请求是否可能不在 Tomcat 日志中,因为它从未完成?
非常感谢
格言
我们有一个 RESTful Web 服务(Java,托管在 Tomcat 中)。有时它会失败(不是每周)。当它失败时,Java CPU 消耗达到 100% 并占用所有可用内存。它不会自行完成。我必须重新启动服务器。
Tomcat 访问日志中没有任何可疑之处。我猜我们的一个用户可能会提交一个非常“繁重”的请求,从而导致服务器停机。这个请求是否可能不在 Tomcat 日志中,因为它从未完成?
非常感谢
格言
您的 Tomcat 进程更有可能正在泄漏内存,直到它没有更多可用内存为止。尝试记录每个请求的堆大小,然后注意它是否不断增长。
tomcat 类加载器可能会泄漏内存,尤其是在您使用“自动部署”功能时。
long freeMem=Runtime.getRuntime().freeMemory();
long maxMem=Runtime.getRuntime().maxMemory();
long totalMem=Runtime.getRuntime().totalMemory();
然后记录 freeMem/MaxMem 和 totalMem。如果 max 继续增长,您就会出现泄漏。
编辑:并回答你的问题。这取决于 tomcat 是如何失败的,以及您是如何设置日志记录的。但是对于我们的系统(一个相当默认的 apache mod_proxy=>tomcat,有一些致命的 tomcat 错误只记录在 catalina.out