相关疑难解决方法(0)

为什么这些Tomcat服务器的JVM每小时执行一次完整的GC?

我们运行许多Tomcat服务器,并且观察到完全垃圾收集(GCs)通常每小时执行一次,特别是当内存使用率相对较低时.精确时间似乎与应用程序服务器启动的时间有关; 如果服务器在01:13启动,则完整GC在02:13完成,下一个完整GC将在03:13完成.我无法找到任何文档来解释这种行为.

这是一个问题,因为同时启动的服务器池都倾向于在大约同一时间执行完整的GC.如果GC延迟足够长,导致负载均衡器将服务器标记为关闭,则整个应用程序可能会脱机一段时间.如果完整的GC可以在一段时间内分配,那么没有两台服务器同时进行完整的GC会更好,但我找不到任何方法来控制这种行为.

有没有人见过这种行为?有没有办法影响这些"常规"完整的GC何时发生?

java tomcat garbage-collection jvm

29
推荐指数
1
解决办法
8108
查看次数

Java vm因所有线程忙于String操作而变慢

我遇到了一个非常奇怪的问题.我的tomcat完全以大约25%的CPU 24/7运行,但有些日子我的CPU上升到60%并且系统停止运转并且无法恢复.

当我在减速期间进行线程转储时,几乎所有线程都忙于某种String或相关操作.

没有OutOfMemory错误或抛出任何异常,所有请求仍然处理但响应时间恶化到第n度,即使次秒请求减慢到60秒甚至更长.

我的服务器配置如下:

    Ubuntu 12.04.2 LTS
    Linux 3.2.0-38-virtual #60-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux
    java version "1.7.0_13"
    Java(TM) SE Runtime Environment (build 1.7.0_13-b20)
    Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)
    export JAVA_OPTS='-server
    -Xms18g -Xmx18g
    -XX:MaxPermSize=512m
    -XX:ThreadStackSize=512
    -XX:NewRatio=1
    -XX:SurvivorRatio=4
    -XX:+UseConcMarkSweepGC
    -XX:+UseParNewGC
    -XX:+CMSClassUnloadingEnabled
    -Xloggc:/usr/tomcat/logs/gc.log
    -XX:+PrintGCDetails
    -XX:+PrintGCDateStamps
    -XX:+PrintTenuringDistribution
    -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.port=9999
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.ssl=false
    -Djava.awt.headless=true'

单击此处下载线程转储.我删除了大量的线程及其stackTraces

单击此处下载vmstat日志

点击这里下载gc log

关于这个原因的任何想法?谢谢

java performance tomcat jvm

24
推荐指数
1
解决办法
6115
查看次数

标签 统计

java ×2

jvm ×2

tomcat ×2

garbage-collection ×1

performance ×1