Full GC仅在PSOldGen中释放少量内存

时间:2013-08-23 03:25:58

标签: java memory garbage-collection jvm

我们最近已经执行了从Solaris SunOS 5.10到Redhat Linux VM的服务器迁移。 JVM从1.5.0_22(32位)升级到1.6.0_06(64位) 但是,从那时起,我们经常遇到OutOfMemory错误。我们研究过64位JVM需要多30-50%的堆,所以我们增加了堆 尺寸从1200MB到2048MB并试一试。但是,我们仍然观察到服务器运行几天之后发生了一些OOME。

检查GC日志后,我们发现在服务器启动几天后经常发生Full GC,并且对于每个Full GC, 它只会释放一点内存,频繁的Full GC会降低应用程序的速度。

正如您可以看到GC日志的摘录,PSOldGen几乎没有发布内存

205023.895: [Full GC [PSYoungGen: 225919K->157256K(240960K)] [PSOldGen: 1841151K->1841151K(1841152K)] 2067071K->1998408K(2082112K) [PSPermGen: 108720K->108720K(109056K)], 6.2785770 secs] [Times: user=6.23 sys=0.01, real=6.28 secs] 
Heap after GC invocations=1638 (full 251):
 PSYoungGen      total 240960K, used 157256K [0x00002aab2e800000, 0x00002aab3e200000, 0x00002aab3e200000)
  eden space 225920K, 69% used [0x00002aab2e800000,0x00002aab38192208,0x00002aab3c4a0000)
  from space 15040K, 0% used [0x00002aab3d350000,0x00002aab3d350000,0x00002aab3e200000)
  to   space 15040K, 0% used [0x00002aab3c4a0000,0x00002aab3c4a0000,0x00002aab3d350000)
 PSOldGen        total 1841152K, used 1841151K [0x00002aaabe200000, 0x00002aab2e800000, 0x00002aab2e800000)
  object space 1841152K, 99% used [0x00002aaabe200000,0x00002aab2e7fffc8,0x00002aab2e800000)
 PSPermGen       total 109056K, used 108720K [0x00002aaaae200000, 0x00002aaab4c80000, 0x00002aaabe200000)
  object space 109056K, 99% used [0x00002aaaae200000,0x00002aaab4c2c3f8,0x00002aaab4c80000)
}  

这是24小时内单个OC4J实例的堆使用模式,这对我来说很奇怪,它没有显示之字形路径,而是一些随机模式。 enter image description here

我可以知道我该怎么办?

服务器配置:

Red Hat Enterprise Linux Server release 5.7 (Tikanga) 2.6.18 274.el5 (64-bit)
CPU : 8, 16GB RAM
JVM version : Java(TM) SE Runtime Environment (build 1.6.0_06-b02)
Application server : OC4J 10.1.3.5

JVM starup参数:

//Old confing
-server -Xms1200M -Xmx1200M -XX:MaxPermSize=64M -XX:+PrintHeapAtGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xnoclassgc -verbose:gc -XX:NewSize=250M -XX:MaxNewSize=250M -XX:SurvivorRatio=15 -Xconcurrentio -Xss128k

//New config
-server -Xms2048M -Xmx2048M -XX:MaxPermSize=256M -XX:+PrintHeapAtGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xnoclassgc -verbose:gc -XX:NewSize=250M -XX:MaxNewSize=250M -XX:SurvivorRatio=15 -Xconcurrentio -Xss128k

1 个答案:

答案 0 :(得分:0)

这是应用程序中的内存泄漏或Java内存管理中的错误。

自1.6.0_06发布以来,有很多关于内存管理和垃圾收集的错误修复,例如这两个:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6676016 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6824570

请尝试以下方法:

  1. 升级到较新的Java 1.6.0版本。 (如果不可能,您可以从(例如)并行到并发更改GC策略设置,以查看是否绕过潜在的Java错误。
  2. 使用heapdump(jmap)解决内存泄漏问题,以查看占用堆的内容。