我正在开发一个带有独立的jetty 9 web服务器的java web应用程序,我遇到了一些内存泄漏的问题:每个连接的客户端,主java进程的内存使用量增加,但GC接缝永远无法恢复。
内存问题在开始时没有出现,我没有对架构的基础进行复杂的更改,所以我认为可能是“一个糟糕的剩余代码”。 该应用程序使用一个webocket servlet来传递推送消息(加上一个单独的线程,使用套接字连接到其他服务)和其他servlet来处理客户端请求(读/写做数据库,登录等)所以也许我没有正确使用服务
我对内存分析没有太多经验,但我见过jetty的jmx + jconsole(docs here和simple tutorial here),我无法弄清楚如何跟踪内存使用单个组件(对象,字段,线程等)。在这种情况下,我应该使用其他工具进行性能分析和内存泄漏调试吗?
答案 0 :(得分:1)
VisualVM是进行内存分析的绝佳方法,最好的方法是它随JDK一起提供。为您的应用程序启用JMX后,您需要connect。一旦连接到它,要开始内存分析,你想用你的Jetty应用程序重新创建你认为导致内存泄漏的情况,然后执行"堆转储"。 "堆转储"将允许您按照要求检查objects, fields, etc。
我可以建议,建造和安装配置基于Jetty的应用程序,Jetty导致内存泄漏的可能性极小。它更可能与您的应用程序级代码相关,或者可能(但也不太可能)与第三方库相关。此外,有时内存泄漏与方法中花费的CPU时间密切相关 - 换句话说,分析CPU可以帮助诊断内存问题,反之亦然。因此,如果您不确定从哪里开始,请查找异常的CPU密集型方法,有时它们会成为问题的根源。