java – Jetty服务器挂起大对象池而没有任何请求

我正在使用带有maven的jetty服务器运行Web应用程序.该应用程序在列表和映射中包含大量静态对象,有助于2.8GB的物理内存使用量.几个小时后,服务器挂起,CPU使用率最高.这种情况发生时没有任何用户交互或在服务器上发出的请求

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

问题:

>错误地收集或检查我的大对象池及其引用时,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

Java的:

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)

Maven的:

Apache Maven 3.0.4

码头:

8.1.8.v20121106

最佳答案 很难说是否由于不正确的GC导致系统挂起.我想你可以采取一些措施来获取更多信息:

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

这是How to Analyze Java Thread Dumps的一篇非常好的文章.

点赞