Java Jetty服务器与大型对象池挂起,但未发出任何请求

Java Jetty服务器与大型对象池挂起,但未发出任何请求,java,garbage-collection,jetty,pool,Java,Garbage Collection,Jetty,Pool,我正在使用jetty server和maven运行一个web应用程序。该应用程序在列表和映射中包含大量静态对象,导致物理内存使用量达到2.8GB。几个小时后,服务器挂起,CPU使用率达到最大值。这在没有任何用户交互或服务器请求的情况下发生 我注意到,在这几个小时内,当服务器运行正常时,内存会慢慢减少到1.7GB。我怀疑这可能是与垃圾收集相关的问题 问题: setenforce 0 export MAVEN_OPTS="-Xmx5120m -Xms5120m -XX:+UseConcMarkSwe

我正在使用jetty server和maven运行一个web应用程序。该应用程序在列表和映射中包含大量静态对象,导致物理内存使用量达到2.8GB。几个小时后,服务器挂起,CPU使用率达到最大值。这在没有任何用户交互或服务器请求的情况下发生

我注意到,在这几个小时内,当服务器运行正常时,内存会慢慢减少到1.7GB。我怀疑这可能是与垃圾收集相关的问题

问题:

setenforce 0
export MAVEN_OPTS="-Xmx5120m -Xms5120m -XX:+UseConcMarkSweepGC -Xgcthreads1 -XX:MaxGCPauseMillis=2000 -XX:GCTimeRatio=10"
sudo nohup mvn -D jetty.port=80 jetty:run &
Ubuntu 12.04.1 LTS
OpenJDK Runtime Environment (IcedTea6 1.11.5) (6b24-1.11.5-0ubuntu1~12.04.1)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
8.1.8.v20121106
  • 可能是GC在错误地收集或检查大型对象池及其引用时挂起了吗
  • 我将如何调试和修复此问题
  • 请注意,在Windows上,我没有此问题。一旦应用程序启动并填满其池,它将占用3.4GB的内存,并且保持不变,不会崩溃

    服务器启动和环境:

    setenforce 0
    export MAVEN_OPTS="-Xmx5120m -Xms5120m -XX:+UseConcMarkSweepGC -Xgcthreads1 -XX:MaxGCPauseMillis=2000 -XX:GCTimeRatio=10"
    sudo nohup mvn -D jetty.port=80 jetty:run &
    
    Ubuntu 12.04.1 LTS
    
    OpenJDK Runtime Environment (IcedTea6 1.11.5) (6b24-1.11.5-0ubuntu1~12.04.1)
    OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
    
    8.1.8.v20121106
    
    操作系统:

    setenforce 0
    export MAVEN_OPTS="-Xmx5120m -Xms5120m -XX:+UseConcMarkSweepGC -Xgcthreads1 -XX:MaxGCPauseMillis=2000 -XX:GCTimeRatio=10"
    sudo nohup mvn -D jetty.port=80 jetty:run &
    
    Ubuntu 12.04.1 LTS
    
    OpenJDK Runtime Environment (IcedTea6 1.11.5) (6b24-1.11.5-0ubuntu1~12.04.1)
    OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
    
    8.1.8.v20121106
    
    Java:

    setenforce 0
    export MAVEN_OPTS="-Xmx5120m -Xms5120m -XX:+UseConcMarkSweepGC -Xgcthreads1 -XX:MaxGCPauseMillis=2000 -XX:GCTimeRatio=10"
    sudo nohup mvn -D jetty.port=80 jetty:run &
    
    Ubuntu 12.04.1 LTS
    
    OpenJDK Runtime Environment (IcedTea6 1.11.5) (6b24-1.11.5-0ubuntu1~12.04.1)
    OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
    
    8.1.8.v20121106
    
    Maven:

    Apache Maven 3.0.4
    
    码头:

    setenforce 0
    export MAVEN_OPTS="-Xmx5120m -Xms5120m -XX:+UseConcMarkSweepGC -Xgcthreads1 -XX:MaxGCPauseMillis=2000 -XX:GCTimeRatio=10"
    sudo nohup mvn -D jetty.port=80 jetty:run &
    
    Ubuntu 12.04.1 LTS
    
    OpenJDK Runtime Environment (IcedTea6 1.11.5) (6b24-1.11.5-0ubuntu1~12.04.1)
    OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
    
    8.1.8.v20121106
    

    很难说是不是由于错误的GC导致系统挂起。我认为您可以采取一些措施来获取更多信息:

  • -verbose:gc-Xloggc:/home/admin/logs/gc.log-XX:+PrintGCDetails-XX:+PrintGCDateStamps
    添加到JVM参数中,这将帮助您找到gc的更多信息
  • 定期收集线程转储,以查看应用程序在运行时发生了什么
  • 当机器即将死亡时,获取一个内存转储,可通过MAT进行分析
  • 当CPU出现峰值时,使用
    top-H-p
    找到支配线程,并在线程转储中找到它们,然后基本上可以找出哪一行代码做错了

  • 这是一篇非常好的文章。

    这是在使用jetty:run进行开发时出现的,还是您正在尝试使用maven和jetty:run运行生产类型实例?如果是后者,则决不是推荐的部署解决方案。它是后者,即生产类型实例。这是一项非常轻量级的服务,因此决定使用Jetty。虽然这是我第一次在生产中使用Jetty,但我发现许多公司在生产中使用Jetty。您是建议我转向更重的东西,比如Glassfish、JBoss、TomEE+还是建议我将实例作为一个jar运行?Thxno,只是不要通过jetty maven插件运行它,要么编写一个嵌入式jetty包装器,要么将其部署到正常的jetty发行版中……问题不在于jetty,这是一个使用maven工具的生产部署场景,maven和它的jetty插件都不打算用于此:)谢谢您的输入。在不同配置下运行Jetty之后,我排除了Jetty这一可能的原因。然而,我接受了你的建议,现在我正在使用jetty runner运行这个应用程序,使用的是jetty runner
    sudo nohup java-server-XMX51120M-Xms5120m-XX:+UseConMarkSweepGC-XX:MaxGCPausEmilis=2000-XX:GCTimeRatio=10-jar target/dependency/jetty-runner.jar--端口80-path/target/geocoder.war&
    ,跟进你的建议和文章(特别是
    jstack
    命令)允许我调试并跟踪问题的可能原因。我正在等待验证解决方案,但似乎GC和Jetty都没有导致挂起,而是在使用DBCP的PoolgDataSource时出现了死锁,即我的编程错误。