2015-02-23 28 views
3

我們在Google雲管理的虛擬機上運行了一個大型Java應用程序(這限制了我認爲控制JVM調整參數的能力)。Java連續GC,ParOldGen用盡

我們在RAM中有數百萬個對象(大約15GB)。

在執行可能涉及創建數萬個對象的任務時(解析巨大的Excel),系統可能會由於垃圾收集而凍結很多分鐘。

我們注意到,總體而言,我們在RAM上不低,但ParOldGen似乎99%被使用。任何建議如何避免這個請嗎?

Heap 
PSYoungGen  total 6083072K, used 267497K [0x000000064eb00000, 0x0000000800000000, 0x0000000800000000) 
    eden space 6078464K, 4% used [0x000000064eb00000,0x000000065f03a438,0x00000007c1b00000) 
    from space 4608K, 0% used [0x00000007c1b00000,0x00000007c1b00000,0x00000007c1f80000) 
    to space 528384K, 0% used [0x00000007dfc00000,0x00000007dfc00000,0x0000000800000000) 
ParOldGen  total 14198272K, used 14197939K [0x00000002ec180000, 0x000000064eb00000, 0x000000064eb00000) 
    object space 14198272K, 99% used [0x00000002ec180000,0x000000064eaacc60,0x000000064eb00000) 
PSPermGen  total 65536K, used 50669K [0x00000002e1b80000, 0x00000002e5b80000, 0x00000002ec180000) 
    object space 65536K, 77% used [0x00000002e1b80000,0x00000002e4cfb640,0x00000002e5b80000) 
+0

如果您可以使用VisualGC連接到JVM,將會非常有幫助。 – 2015-02-23 20:06:26

+0

請參閱http://stackoverflow.com/questions/3003855/increase-permgen-space – 2015-02-23 20:08:34

+0

感謝但運行在託管虛擬機上(由Google創建的Docker環境中)我不確定我們可以運行Visual GC或使用參數如-XX:MaxPermSize – user1176505 2015-02-23 20:15:03

回答

1

如在this article on Java GC中所述,ParOldGen(或並行舊版Gen(Mark Sweep)GC)在處理大量內存碎片時可能需要很長時間才能「停止世界」階段,這是您期望的看到這樣一個物體沉重的模式。也許這是值得閱讀的解釋發生了什麼?

至於increasing the heap size,可以使用JVM選項完成此操作,在使用自定義運行時/靈活環境應用程序時可以對其進行操作。你也可以configure the amount of memory each instance will have

最後,您還可以使用JVM選項select which GC algorithms should run。如果沒有ParOldGen,您可能會發現應用程序性能更好。