2009-02-19 76 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啓動的啓動選項 。

現在你可以看到內存的哪部分增長了。

相關問題