有人对调试 GlassFish 上的连接泄漏有什么好的建议吗?
我目前正在调试一个 GlassFish 服务器,其中包含一个偶尔出现内存泄漏的应用程序,最终导致必须重新启动服务器才能释放池(我听说池清除仅在 Glassfish 3 中可用)。
今天,当我调试这些类型的错误时,我会查看当时的服务器日志,看看我们的监控报告池已经增长,看看此时是否存在任何有趣的错误或类似错误。
有人有更好的方法来调试这些问题吗?
所有应用程序都是使用注释来注入数据源的 EJB/EAR。然后应用程序使用数据源来获取连接。当然,每个连接都应该由程序员关闭,但我猜有人在这里忘记了这一点。
答案1
我认为跟踪内存泄漏的一个好方法是将 VisualVM 附加到正在运行的 Java 进程(在本例中为 GF 实例)并查看堆转储的参考树。
我想到另一种方法,但需要做一些工作,那就是编写自己的连接/连接池包装器,并在每次从池中获取连接以及关闭连接时记录堆栈跟踪。
答案2
您可以为连接池设置“连接泄漏回收”选项,并且可以在服务器日志中获得指示根本原因的完整堆栈跟踪。
请参阅文档页面 -http://docs.oracle.com/cd/E19879-01/820-4335/geveg/index.html。