2011-10-13 45 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