2011-07-20 30 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中存在内存泄漏。我刚升级到一切,一切都很好。