我正在尝试诊断我的 Web 应用程序中的生产内存泄漏。该应用程序是在 Tomcat 7 和 mySQL 上运行的 GWT 应用程序,以及在 Debian 上运行的 OpenJDK 1.6.0_18。
我启动了 tomcat 并让应用程序泄漏了几天——没有重新加载应用程序——然后进行了堆转储并在 Eclipse MAT 插件中打开它。我试图理解我所看到的。似乎从 tomcat 登录类中保存了大量内存(请参见下面的屏幕截图)。
我使用 java 日志框架在我的 GWT servlet 中进行基本日志记录。只是基本的电话,比如
Logger.getAnonymousLogger().log(Level.INFO, "User" + userId + " did something interesting");
Logger.getAnonymousLogger().log(Level.SEVERE, exception.getMessage(), exception);
我在网上能找到的唯一类似的问题是这篇博文。
谁能解释这里可能发生了什么?为什么 tomcat 日志记录类会占用这么多内存?
更让我困惑的是,它似乎持有大量的弱引用——但我似乎无法在 MAT 中弄清楚如何找出那些弱引用所指向的内容,而且我也期待弱引用当达到堆限制时被收集,但tomcat会抛出内存异常。