2009-02-19 38 views

回答

1

这是不正常的,并且可能指示memory leak

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

一般而言,您应该寻找循环或重复的操作,其中创建对象但不正确地使用disposed of

+0

这对服务器JVM来说是正常的。 – 2009-02-19 16:06:17

+1

@sjbotha:持续增长肯定是/不正常。 – GEOCHET 2009-02-19 16:20:04

+0

我认为这取决于它是否持续增长,没有任何界限 – 2009-02-19 18:21:40

0

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

如果您对诊断此类问题相对较新,我会推荐jprofiler。您可以下载一个功能完整的试用版并获取内存快照以查看内存中的对象。您可以使用这些信息来确定哪些物体是泄漏的来源。

9

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

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

如果要诊断内存泄漏,有一批优秀的可用工具,包括与Eclipse,NetBeans中的IntelliJ工作几个免费的,等

5

太阳的默认行为“服务器”热点放大堆而不是清除SoftReference(用于高速缓存)。默认情况下,为每个可用的最大堆大小的兆字节保留一秒。所以,预计堆将增长到最大尺寸。如果你确实用了OutOfMemoryException的内存,或者性能变差(由于过多的GC或小缓存),那么你需要寻找内存泄漏。

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

4

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

使用jconsole查看实际使用的数量。做GC,看看它发生了什么。这个数字不应该随着时间的推移而增长,或者你有内存泄漏。使用visualvm来调试内存泄漏。

每次重新加载它使用额外的烫发根内存不能被回收的应用程序时(在太阳JVM,其他类似的JRockit没有这个问题)。在生产中,你不应该重新加载应用程序。每次重新启动Tomcat。如果你真的想继续这样做,那么你可以增加最大内存,也可以通过标记-XX增加Max Perm Gen内存:MaxPermSize = 256m

4

通过程序Lambda Probe你可以很容易地看看Tomcat的内存使用情况。 (选项系统信息 - 内存利用率)。 您可以在图中看到生存空间烫发根终身根伊甸园空间的代码缓存

就部署这warfile到Tomcat并设置-Dcom.sun.management.jmxremote到Java启动的启动选项 。

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

相关问题