2011-10-13 79 views
0

使用jmx並監控一個web應用程序時,我注意到GC(G1)運行時,所有線程都凍結,應用程序不響應。我配置Tomcat的JVM中是這樣的:當使用的堆內存達到最大極限(2GB)和GC記憶深刻工作java gc釋放應用程序

-Xms2048m 
-Xmx2048m 
-XX:NewSize=512m 
-XX:MaxNewSize=512m 
-XX:PermSize=512m 
-XX:MaxPermSize=512m 
-XX:+DisableExplicitGC 
-Xss2m 
-XX:+CMSClassUnloadingEnabled 
-XX:+UseG1GC 
-Djava.net.preferIPv4Stack=true 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=8338 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=true 
-Dhazelcast.logging.type=slf4j 

應用程序沒有響應。在gc工作後,使用的堆降到300Mb。是否可能爲GC設置不同的工作方式?這對我的應用程序來說是一個很大的問題,因爲我使用了hazelcast和jgroups,並且每次gc工作時,都會導致集羣分區。

,我在此Web應用程序使用一些特殊的庫: 1)hazelcast 1.9.4 2)阿卡0.10 3)球衣1.2

+0

您使用的是32位JVM/JDK嗎?如果是這樣,最大可分配內存是2 Gig,所以你可能會用Xms2048m來做到這一點(它試圖從頭開始分配2 Gig的頭) –

回答

0

該問題可能是一個事實,即你需要-XX:UnlockExperimentalVMOptions那麼簡單,因爲(AFAIK)G1GC仍然被認爲是實驗性的。


有多種其他的實驗,具體的HotSpot JVM的參數的個數,你可以玩的,如果不這樣做的伎倆:

  • -XX:+UseParallelGC
  • -XX:+UseConcMarkSweepGC
  • 等。 ...

請參閱http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html