为什么我的tomcat应用程序的内存使用量不断增长?

时间:2009-02-19 15:34:19

标签: java tomcat memory-management memory-leaks

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

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

6 个答案:

答案 0 :(得分:9)

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

您还可以查看垃圾收集信息,其中包含各种开关和参数,例如-verbose:gc。

如果您想诊断内存泄漏,可以使用许多优秀的工具,包括几个可以与Eclipse,NetBeans,IntelliJ等一起使用的免费工具。

答案 1 :(得分:6)

Sun“server”HotSpot的默认行为是放大堆而不是清除SoftReference(用于缓存)。默认设置是为每兆字节可用的最大堆大小保留一秒钟。因此,期望堆增长到最大大小。如果实际上用OutOfMemoryException实际耗尽内存或性能变差(由于过多的GC或小缓存),那么你需要查找内存泄漏。

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

答案 2 :(得分:4)

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

使用jconsole查看实际使用量。做GC并观察它的发展方向。这个数字不应该随着时间的推移而增长,或者你有内存泄漏。使用visualvm调试内存泄漏。

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

答案 3 :(得分:4)

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

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

现在你可以看到内存的哪个部分在增长。

答案 4 :(得分:1)

这不正常,可能表示memory leak

您应该尝试使用memory profiler查看应用程序泄漏的位置。

通常,您应该查找创建对象但不能正确disposed of的循环或重复操作。

答案 5 :(得分:0)

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

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