【发布时间】:2010-10-08 15:05:50
【问题描述】:
我的应用程序在 Windows Server 2000 上运行。内存使用量不断增长(从 145m)。
这正常吗?我是 Java 新手。版本为Tomcat5.5。
【问题讨论】:
标签: java tomcat memory-management memory-leaks
我的应用程序在 Windows Server 2000 上运行。内存使用量不断增长(从 145m)。
这正常吗?我是 Java 新手。版本为Tomcat5.5。
【问题讨论】:
标签: java tomcat memory-management memory-leaks
如果它只会增长,那就是内存泄漏。但是如果它增长到你的最大堆,然后下降,那么这是正常的垃圾收集行为。您可以使用许多工具来了解更多信息。最简单的方法之一是连接 JConsole(JDK 的一部分)并随着时间的推移观察您的堆。
您还可以使用各种开关和参数(例如 -verbose:gc)来查看垃圾收集信息。
如果您想诊断内存泄漏,有许多优秀的工具可供使用,包括一些适用于 Eclipse、NetBeans、IntelliJ 等的免费工具。
【讨论】:
Sun“服务器”HotSpot 的默认行为是扩大堆而不是清除SoftReferences(用于缓存)。默认设置是每兆可用的最大堆大小保持一秒钟。因此,期望堆增长到最大大小。如果您确实用OutOfMemoryException 耗尽了内存或性能变差(由于过多的 GC 或小缓存),那么您需要查找内存泄漏。
此外,Tomcat 服务器在重新加载应用程序后经常会出现内存泄漏。例如,Tomcat 在所有应用程序之间共享线程,这经常导致 Sun 的 ThreadLocal 实现不正确地保留值。
【讨论】:
IMO Tom Hawtin 的回答是最好的。它会增长直到达到最大值,然后运行 GC。在服务器环境中,这是有道理的:您想要最好的性能,而不是最好的内存使用。您预先计算内存总量,然后给每个应用程序一个最大值,然后一切都适合并具有最佳性能。可以调整此行为。
使用 jconsole 查看实际使用了多少。做 GC 并观察它的结果。这个数字不应该随着时间的推移而增长,否则你有内存泄漏。使用 visualvm 调试内存泄漏。
每次重新加载应用程序时,它都会使用无法回收的额外 Perm Gen 内存(在 Sun JVM 中,像 JRockit 之类的其他应用程序没有这个问题)。在生产中,您不应该重新加载应用程序。每次重启Tomcat。如果您真的想继续这样做,那么您可以增加最大内存并使用标志 -XX:MaxPermSize=256m 增加 Max Perm Gen 内存
【讨论】:
使用Lambda Probe 程序,您可以轻松查看 Tomcat 中的内存使用情况。 (选项系统信息 - 内存利用率)。 可以在图中看到 Survivor Space Perm Gen Tenured Gen Eden Space Code Cache
只需将此warfile部署到tomcat并设置启动选项 -Dcom.sun.management.jmxremote 到 Java 启动。
现在您可以看到内存增长的部分。
【讨论】:
这不正常,可能表示memory leak。
您应该尝试使用memory profiler 来查看您的应用程序在哪里泄漏。
一般来说,您应该寻找创建对象但不正确disposed of 的循环或重复操作。
【讨论】:
您可能有内存泄漏。我会首先将 jconsole 连接到您的应用程序以确定它是永久空间还是只是堆内存,然后继续找出泄漏的位置。你能给我们更多的信息吗?随着内存的增长,您的应用程序中发生了什么?
如果您对诊断此类问题比较陌生,我建议您使用 jprofiler。您可以下载功能齐全的试用版并拍摄内存快照以查看内存中的对象。您可以使用此信息来确定哪些对象是泄漏源。
【讨论】: