【问题标题】:How can I find out why Tomcat is using so much memory and stop it?如何找出 Tomcat 使用这么多内存的原因并停止它?
【发布时间】:2014-08-06 23:57:47
【问题描述】:

我正在使用 YourKit Java Profiler 分析我的 web 应用程序。 webapp 在 tomcat 7 v30 上运行,我可以看到 JVM 的堆约为 30 兆字节,但 Tomcat.exe 正在使用 200 兆字节并且不断上升。

截图:http://i.imgur.com/Zh9NGJ1.png (左边是 Java 使用了多少内存分析器,右边是 Windows 对 tomcat.exe 的使用)

我尝试向 tomcat 添加不同的标志,但内存使用量仍然不断上升。我也尝试过预编译我的 .jsp 文件以防万一,但它没有。

我添加到 tomcat 的 java 标志中的标志:

-XX:+UseG1GC
-XX:MinHeapFreeRatio=10
-XX:MaxHeapFreeRatio=10
-XX:GCTimeRatio=1

如果这很重要的话,Tomcat 也可以作为 Windows 服务运行。

我需要帮助来弄清楚如何让 tomcat 使用更少的内存/知道它为什么使用这么多内存。就像现在一样,它会一直运行,直到它使用整个系统的内存。

【问题讨论】:

  • 您是否在使用任何本机 (jni) 库?
  • 我不这么认为,但我们正在使用很多库,因此其中一个或多个库可能正在使用一些 JNI 代码。有没有一种简单的方法来调试这是否是问题?
  • 使用 jvisualvm 查看内存占用情况。
  • windows报告的内存增长了多少?它是趋于平稳还是无限增长?
  • @ScaryWombat 我正在使用 YourKit Java Profiler,它目前表示 Java 在运行时使用了大约 30-40 兆,并且内存中没有太多东西。但是 tomcat 进程当前同时使用 250 兆字节的内存,并且在 Java Profiler 仍然显示 Java 内存使用量没有上升时一直在上升。

标签: java tomcat memory-management jvm tomcat7


【解决方案1】:

所以我找到的解决方案是在 tomcat 运行中添加一些标志。

不确定是哪个标志。我认为它可能是我们正在使用的 jacob 库,或者这些标志的组合。希望这可以帮助未来的人们。

-XX:+UseG1GC
-XX:MinHeapFreeRatio=10
-XX:MaxHeapFreeRatio=10
-XX:GCTimeRatio=1
-Dcom.jacob.autogc=true
-Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true

【讨论】:

    【解决方案2】:

    您应该查找应用程序中的内存泄漏,或者存在时间过长且未失效的大型会话。试着想想哪个功能长时间持有太多的对象。

    【讨论】:

    • Tomcat 有 6 个会话打开,没有超过 30 分钟前的会话。所以这似乎不是内存猪。 (如果这运行了 20 小时,我看到使用了一个 Tomcat 内存,但 java 仍然分析为低于 200 兆)。
    【解决方案3】:

    你可以转储你的内存,看看是什么在使用它。很可能它将是您的应用程序对象的长列表,或者您在不知不觉中内化的字符串。

    您可以使用 jvisualvm 之类的工具,或者很酷的 eclipse 工具:http://www.eclipse.org/mat/ 来做到这一点。

    如果你这样做但仍然不知道为什么,那么请告诉我们你记忆中的对象......

    【讨论】:

    • 正如我在 OP 中提到的,我已经这样做了。 JVM 中没有泄漏。例如,根据 JVM,我的堆是 20 兆,但 tomcat.exe 进程将使用 200 兆。
    猜你喜欢
    • 1970-01-01
    • 2020-10-30
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多