使用jmx并监控Web应用程序,我注意到当GC(G1)运行时,所有线程都被冻结,应用程序没有响应。我像这样配置了tomcat jvm:
-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
当使用的堆内存达到最大限制(2GB)并且GC深入处理内存时,应用程序不响应。在gc工作之后,使用的堆减少到300Mb。是否有可能为GC设置不同的工作方式?这对我的应用程序来说是个大问题,因为我使用了hazelcast和jgroups,每次gc工作时,它都会导致集群的分区。
我在此Web应用程序中使用的一些特殊库: 1)淡褐色1.9.4 2)akka 0.10 3)球衣1.2
答案 0 :(得分:0)
问题可能就像你需要-XX:UnlockExperimentalVMOptions
一样简单,因为(AFAIK)G1GC仍然被认为是实验性的。
如果不能解决问题,你可以使用其他各种实验性的,特定于HotSpot的JVM args:
-XX:+UseParallelGC
-XX:+UseConcMarkSweepGC
请参阅http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html。