2013-08-23 64 views
0

我們最近已執行從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僅在PSOldGen中釋放小內存

檢查GC日誌後,我們發現在服務器啓動幾天之後,經常發生完全GC,並且對於每個完整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) 
} 

這裏是一個OC4J實例在24小時內堆的使用模式,這是相當奇怪,我,它不顯示鋸齒形路徑,而是顯示一些隨機模式。 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 

回答

0

無論這是在Java的內存管理的應用程序錯誤,還是一個內存泄漏。

由於1.6.0_06版本有bug修復的關於內存管理和垃圾收集,例如這兩個一大堆:

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 bug。
  2. 使用heapdump(jmap)查看內存泄漏的應用程序故障排除以查看佔用情況堆。