2011-07-20 29 views
0

我們有一個用gwt編寫並在tomcat中部署的web應用程序。 tomcat在內存異常時崩潰,所以我試圖使用Jprofiler,jmap/jhat實用程序等查找內存泄漏。檢測Web應用程序中的內存泄漏

下面是我看到的問題,並感謝專家的幫助,以追查問題。

我配置了tomcat以-Xmx1600m -Xms1024m運行並啓用了gc日誌記錄。當我運行了幾個小時申請後看到GC日誌,我看到下面

9850.373: [GC [PSYoungGen: 301459K->10630K(341504K)] 943137K->663019K(1269952K), 0.1711120 secs] [Times: user=0.32 sys=0.02, real=0.17 secs] 
9864.412: [GC [PSYoungGen: 320588K->14287K(341376K)] 972976K->668772K(1269824K), 0.1604710 secs] [Times: user=0.24 sys=0.00, real=0.16 secs] 
9874.808: [GC [PSYoungGen: 324431K->7800K(377792K)] 978916K->666111K(1306240K), 0.1253720 secs] [Times: user=0.21 sys=0.04, real=0.12 secs] 
9884.888: [GC [PSYoungGen: 355320K->7639K(377920K)] 1013631K->670793K(1306368K), 0.1563460 secs] [Times: user=0.23 sys=0.01, real=0.15 secs] 
9897.209: [GC [PSYoungGen: 355159K->9687K(423552K)] 1018313K->676330K(1352000K), 0.1368880 secs] [Times: user=0.22 sys=0.05, real=0.14 secs] 
9913.372: [GC [PSYoungGen: 403927K->5599K(424000K)] 1070570K->675351K(1352448K), 0.1599430 secs] [Times: user=0.21 sys=0.02, real=0.16 secs] 
9999.866: [GC [PSYoungGen: 399839K->6655K(468480K)] 1069591K->678050K(1396928K), 0.2453910 secs] [Times: user=0.37 sys=0.03, real=0.24 secs] 
10104.177: [GC [PSYoungGen: 449919K->10830K(472576K)] 1121314K->688787K(1401024K), 0.1271810 secs] [Times: user=0.20 sys=0.03, real=0.12 secs] 
10114.859: [GC [PSYoungGen: 454094K->7316K(514240K)] 1132051K->694401K(1442688K), 0.1046640 secs] [Times: user=0.15 sys=0.05, real=0.10 secs] 
10127.079: [GC [PSYoungGen: 496084K->6783K(516160K)] 1183169K->699705K(1444608K), 0.1004840 secs] [Times: user=0.17 sys=0.03, real=0.10 secs] 
10136.380: [GC [PSYoungGen: 495551K->8800K(516096K)] 1188473K->707881K(1444544K), 0.1615950 secs] [Times: user=0.28 sys=0.04, real=0.16 secs] 
10151.757: [GC [PSYoungGen: 500704K->13808K(517696K)] 1199785K->716602K(1446144K), 0.2068230 secs] [Times: user=0.32 sys=0.09, real=0.20 secs] 
10184.481: [GC [PSYoungGen: 505712K->4543K(519488K)] 1208506K->716201K(1447936K), 0.2158960 secs] [Times: user=0.32 sys=0.05, real=0.22 secs] 
10206.485: [GC [PSYoungGen: 499647K->12190K(520192K)] 1211305K->728137K(1448640K), 0.2251280 secs] 

我從gc.log理解如下,

年輕一代的垃圾收集後採用12190K。 老一代在垃圾回收後使用728137K。

因此,總共應用程序使用740M。我的理解是對的嗎?

如果不是,這個日誌文件的正確解釋是什麼?

如果是的話,我也看到了使用htop(在Linux上運行它)顯示tomcat進程正在使用1419M的系統資源使用情況。

爲什麼在內存使用的差異?

感謝您的幫助! 謝謝。

+1

嘗試添加啓動標誌-XX:+ HeapDumpOnOutOfMemoryError以進一步診斷。下一次JVM耗盡內存時,它將轉儲堆的內容。這應該會給你更多的信息。 http://www.oracle.com/technetwork/java/javase/memleaks-137499.html#gdyrr – Sean

+0

也基於年輕的gen大小,我沒有看到該日誌中提供的OOMException。例如您的最後一個條目:499647K-> 12190K年輕的發現恢復了大約95%。老根從1211305K減少到728137K,減少了45%左右。似乎有很多空間來你的帽@ 1600m – Sean

+0

我已經添加了-XX:+ HeapDumpOnOutOfMemoryError,但OOM還沒有發生。 – Kathir

回答

0

在2.4中修復了GWT Requestfactory中存在內存泄漏。我剛升級到一切,一切都很好。