2013-01-17 82 views
4

我正在運行一個web應用程序使用maven的jetty服務器。該應用程序在列表中包含大量靜態對象列表地圖有助於2.8GB的物理內存使用量。幾個小時後,服務器會以最大CPU使用率掛起。沒有任何用戶交互或服務器上發出請求,就會發生這種情況Jetty服務器掛起大對象池,沒有任何請求

我注意到,在這幾個小時內,雖然服務器運行良好,但內存緩慢降低到1.7GB。我的懷疑是這可能是垃圾收集相關的問題。

問題:

  1. 難道是GC掛起而錯誤地收集或檢查我的大對象池及其引用?
  2. 我將如何去調試和解決這個問題?

請注意,在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 
+0

這是在jetty開發過程中顯示的:運行或者您是否嘗試使用maven和jetty運行生產類型實例:run?如果是後者,它絕不是推薦的部署解決方案。 –

+0

它是後面的,即生產型實例。這是一項非常輕便的服務,因此決定採用Jetty。雖然這是我第一次在生產中使用Jetty,但我發現許多公司在生產中使用碼頭。你是否建議我應該轉向更重量級的東西,比如Glassfish,JBoss,TomEE +或者我應該將該實例作爲jar來運行? Thx –

+2

不,只是不要通過jetty-maven-plugin運行它,要麼編寫一個嵌入式jetty wrapper,要麼將其部署到普通的jetty發行版中...是不是碼頭問題,它是一個生產部署使用maven工具的場景,既不maven也不jetty插件打算用於:) –

回答

2

這很難說,如果這是由於不正確的GC導致系統掛起。我覺得你可以做一些動作,以獲得更多信息:

  1. 添加-verbose:gc -Xloggc:/home/admin/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStampsJVM參數,這些將幫助您找到GC的更多信息。
  2. 定期收集線程轉儲以查看您的應用程序在運行時發生了什麼。
  3. 得到一個內存轉儲當機器即將死亡,這可以由MAT分析。
  4. CPU峯值時,使用top -H -p<pid>找到支配者線程,並在線程轉儲中找到它們,然後您就可以基本找出代碼的哪一行做錯了。

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

+0

繼續您的建議和文章(尤其是'jstack'命令),讓我可以調試並追蹤可能的原因,解決我的問題。我正在等待驗證解決方案,但似乎GC和Jetty都沒有引起掛起,而是使用DBCP的PoolingDataSource時出現死鎖,即我的編程錯誤。 –