gpt4 book ai didi

java - tomcat 7 org.apache.juli.ClassLoaderLogManager$RootLogger 内存泄漏

转载 作者:行者123 更新时间:2023-11-28 21:56:40 24 4
gpt4 key购买 nike

我正在尝试诊断我的 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);

我在网上能找到的唯一类似问题是这个 blog post .

谁能解释一下这里可能发生了什么?为什么 tomcat 日志记录类会占用这么多内存?

Screenshot of MAT analysis

更让我困惑的是,它似乎持有大量的弱引用——但我似乎无法在 MAT 中弄清楚如何找出那些弱引用指向的内容,而且我也会期望在达到堆限制时收集弱引用,但 tomcat 会抛出内存不足异常。

Giant Array of Weak References

最佳答案

有趣的问题:)

看起来数以百万计的类中有 10 个已经使用您的 RootLogger 注册了记录器。现在,除非您的项目中有数百万个类,否则:

  • A 类定期调用 Logger.getAnonymousLogger() , 或
  • 正在动态生成记录器或类:
    • 这些可能来自:
      • > java.lang.reflect.Proxy
      • 一种脚本语言(如 Groovy),您可以在其中动态创建类
      • 字节码操作库
      • 直接调用 new Logger(name)
    • 每个创建的类都会注册一个记录器 - LogManager.addLogger()
    • 一段时间后,Logger(以及创建的任何类)被 GCed

无论哪种方式,每个额外的记录器都会向包含弱引用的 ArrayList 添加另一行。弱引用开始指向记录器,但记录器正在被 GC 留下,只留下空的弱引用。导致 OOM 的是大量弱引用,而不是它们(过去)指向的对象。

修复?

  • 如果您正在使用匿名日志记录,请不要。这是供小程序使用的。
  • 查看动态类中是否有 LogManager.addLogger。如果是这样,强制记录器名称为常量
  • 检查您是否有类似new Logger(variable) 的东西。如果这样做,则需要将变量更改为常量。

关于java - tomcat 7 org.apache.juli.ClassLoaderLogManager$RootLogger 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15854826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com