【问题标题】:Why does my tomcat application's memory usage keep growing?为什么我的 tomcat 应用程序的内存使用量不断增长?
【发布时间】:2010-10-08 15:05:50
【问题描述】:

我的应用程序在 Windows Server 2000 上运行。内存使用量不断增长(从 145m)。

这正常吗?我是 Java 新手。版本为Tomcat5.5。

【问题讨论】:

    标签: java tomcat memory-management memory-leaks


    【解决方案1】:

    如果它只会增长,那就是内存泄漏。但是如果它增长到你的最大堆,然后下降,那么这是正常的垃圾收集行为。您可以使用许多工具来了解更多信息。最简单的方法之一是连接 JConsole(JDK 的一部分)并随着时间的推移观察您的堆。

    您还可以使用各种开关和参数(例如 -verbose:gc)来查看垃圾收集信息。

    如果您想诊断内存泄漏,有许多优秀的工具可供使用,包括一些适用于 Eclipse、NetBeans、IntelliJ 等的免费工具。

    【讨论】:

      【解决方案2】:

      Sun“服务器”HotSpot 的默认行为是扩大堆而不是清除SoftReferences(用于缓存)。默认设置是每兆可用的最大堆大小保持一秒钟。因此,期望堆增长到最大大小。如果您确实用OutOfMemoryException 耗尽了内存或性能变差(由于过多的 GC 或小缓存),那么您需要查找内存泄漏。

      此外,Tomcat 服务器在重新加载应用程序后经常会出现内存泄漏。例如,Tomcat 在所有应用程序之间共享线程,这经常导致 Sun 的 ThreadLocal 实现不正确地保留值。

      【讨论】:

      • Tomcat 不会泄漏,除非应用程序留下线程或在 VM 中安装挂钩。
      • 我会稍微修改一下我的陈述。例如,Sun ThreadLocal 实现通常会导致泄漏,因为 Tomcat 不会丢弃线程。我不知道 crazybob 的 Harmony 实现是做什么的。
      【解决方案3】:

      IMO Tom Hawtin 的回答是最好的。它会增长直到达到最大值,然后运行 ​​GC。在服务器环境中,这是有道理的:您想要最好的性能,而不是最好的内存使用。您预先计算内存总量,然后给每个应用程序一个最大值,然后一切都适合并具有最佳性能。可以调整此行为。

      使用 jconsole 查看实际使用了多少。做 GC 并观察它的结果。这个数字不应该随着时间的推移而增长,否则你有内存泄漏。使用 visualvm 调试内存泄漏。

      每次重新加载应用程序时,它都会使用无法回收的额外 Perm Gen 内存(在 Sun JVM 中,像 JRockit 之类的其他应用程序没有这个问题)。在生产中,您不应该重新加载应用程序。每次重启Tomcat。如果您真的想继续这样做,那么您可以增加最大内存并使用标志 -XX:MaxPermSize=256m 增加 Max Perm Gen 内存

      【讨论】:

      • MaxPermSize 原来是我的问题。在开发过程中,我们不断部署应用程序的更新版本。
      【解决方案4】:

      使用Lambda Probe 程序,您可以轻松查看 Tomcat 中的内存使用情况。 (选项系统信息 - 内存利用率)。 可以在图中看到 Survivor Space Perm Gen Tenured Gen Eden Space Code Cache

      只需将此warfile部署到tomcat并设置启动选项 -Dcom.sun.management.jmxremote 到 Java 启动。

      现在您可以看到内存增长的部分。

      【讨论】:

        【解决方案5】:

        这不正常,可能表示memory leak

        您应该尝试使用memory profiler 来查看您的应用程序在哪里泄漏。

        一般来说,您应该寻找创建对象但不正确disposed of 的循环或重复操作。

        【讨论】:

        • 服务器JVM正常。
        • @sjbotha:持续增长绝对是/不/正常的。
        • 我认为这取决于它是否是无限制的持续增长
        【解决方案6】:

        您可能有内存泄漏。我会首先将 jconsole 连接到您的应用程序以确定它是永久空间还是只是堆内存,然后继续找出泄漏的位置。你能给我们更多的信息吗?随着内存的增长,您的应用程序中发生了什么?

        如果您对诊断此类问题比较陌生,我建议您使用 jprofiler。您可以下载功能齐全的试用版并拍摄内存快照以查看内存中的对象。您可以使用此信息来确定哪些对象是泄漏源。

        【讨论】:

        • 此应用已运行多年。最近发现了这个问题,因为网站运行很慢。我想知道是否有人更改了配置。我认为没有内存泄漏,因为没有人更改代码。
        猜你喜欢
        • 1970-01-01
        • 2015-11-11
        • 2011-02-03
        • 2012-01-11
        • 2013-10-08
        • 1970-01-01
        • 2017-11-09
        • 1970-01-01
        相关资源
        最近更新 更多