【问题标题】:RMI/Tomcat 6 Memory LeakRMI/Tomcat 6 内存泄漏
【发布时间】:2015-12-21 09:25:54
【问题描述】:

我的应用程序同时使用 RMI 和 JDBC 与远程系统和数据库通信。虽然数据库问题已得到解决,但事实证明 RMI 导致 Tomcat 6 检测到某种形式的内存泄漏(我也在 Tomcat 7 上尝试过,我们遇到了同样的问题)。

基本上,当我们启动应用程序并且用户在网页中输入信息时,会对后端系统进行 RMI 调用。如果我们停止/启动或重新启动应用程序,Tomcat 管理器现在可以检测到内存泄漏。如果我们启动应用程序并且不进行 RMI 调用,我们可以整天启动/停止和重新启动应用程序而不会出现问题。

有谁知道需要做些什么来防止 RMI 调用在网络服务器仍在运行时重新加载或停止/启动时导致 WebappClassLoader 中的内存泄漏?

【问题讨论】:

  • tomcat 的消息是什么?是关于 ThreadLocal 的吗?
  • 不,仅此而已 - 日志中没有错误消息。但是,Tomcat 管理器声称,如果我在使用 RMI 调用的应用程序中执行某些操作后单击“查找泄漏”按钮,然后使用管理器重新加载/停止应用程序,则会发现泄漏。我可以在 jvisualvm 中看到确实创建了一个新的 WebappClassLoader(上下文)。

标签: java tomcat memory-leaks rmi


【解决方案1】:

我的应用程序同时使用 RMI 和 JDBC 与远程系统和数据库通信。虽然数据库问题已经解决,但事实证明 RMI 正在导致 Tomcat 6 检测到某种形式的内存泄漏......有谁知道需要做些什么来防止 RMI 调用在重新加载时导致 WebappClassLoader 中的内存泄漏或在网络服务器仍在运行时停止/启动?

RMI 调用不会导致内存泄漏。我有八个通过 RMI 进行大量交互的 Tomcat,除此之外,它们已经运行了几个月,没有任何泄漏迹象。

【讨论】:

  • 当我停止/启动或重新加载应用程序时,如果我在此之后立即使用管理器进行检查,Tomcat 会发现内存泄漏。我使用 jvisualvm 分析了 JVM,罪魁祸首似乎是位于 GC Root 顶部的 sun.rmi.transport.DGCClient。您是在网络服务器运行的情况下启动/停止或重新加载应用程序,还是在部署后停止 tomcat?
  • 我可以在运行Tomcat的情况下重新加载一次或两次,然后我必须重新启动Tomcat。但这适用于汤姆说 RMI 也是如此。您必须在此处提供适当的详细信息。什么内存泄漏?你有什么证据表明 RMI 参与其中?你的 RMI 代码是什么样的?
  • 我无权透露代码本身,但这就是为什么我说我们有内存泄漏。 Tomcat 管理器声称,如果我在使用 RMI 调用的应用程序中执行某些操作后单击“查找泄漏”按钮,然后使用管理器重新加载/停止应用程序,则会发现泄漏。我可以在 jvisualvm 中看到确实创建了一个新的 WebappClassLoader(上下文)。
  • 当然会创建一个新的 WebAppClassLoader。您重新加载了应用程序。这与 RMI 无关。而且没有代码 => 没有答案。
  • 不再需要了。是 DGCClient 需要清理资源。清洁工终于跑了,容器完成了关闭。
【解决方案2】:

DGCClient 没有清理任何与 RMI 相关的资源,需要等待超时才能触发。由于容器试图停止,但 RMI 资源一直在闲逛,这会根据 Tomcat 管理器产生内存泄漏,该管理器会在 DGC 收集 RMI 资源后自行清理并纠正内存泄漏情况。

【讨论】:

    猜你喜欢
    • 2014-12-25
    • 2015-12-27
    • 1970-01-01
    • 2012-08-20
    • 2012-08-06
    • 2013-07-29
    • 2015-06-04
    • 2014-04-03
    • 2013-09-21
    相关资源
    最近更新 更多