tomcat運行久了,需要重新啟動,才能接收客戶端請求,但是靜態資源可以訪問,怎麼解決?

比如客戶端登錄,登錄網頁可以打開,但是輸入賬號密碼之後,點擊登錄提交表單,tomcat沒反應。


題主,這個可以通過jstack查看下當前Tomcat進程的線程運行情況,都在執行什麼。也可以看下是否在頻繁的進行Full GC導致請求無法被響應。GC的次數的時間也可以通過Jconsole/VisualVM這些工具查看,甚至可以dump出內存分析下。當然,如問題評論下R大的回復,遠程debug一下你的應用代碼也可以,只需要把Tomcat以debug方式啟動,attach上去,在你的代碼里加斷點執行就OK了。


謝題主邀…根據題主的描述我提出兩個猜測…

1. 可能在題主不知情的情況下網站配置了apache,nginx等網站伺服器,並且由他們對請求進行了轉發。比方說將*.html,*.js,*.css的網站使用apache/nginx等來處理請求,對*.do,*.action,*等請求使用tomcat處理。這樣,當tomcat運行久了出現某個異常導致其中斷時,靜態資源不會受到影響,而需要tomcat處理的請求則會受到影響。

2. 瀏覽器緩存問題。題主在發現請求無法處理的時候,在本地緩存了靜態資源,之後的每次訪問都使用緩存來進行,也會出現題主描述的情況。

排查第一種情況很簡單,查看一下當前在運行的進程,看看是否有其他伺服器程序在運行即可。

排查第二種情況更簡單,只要在下次出現異常的時候清理一下瀏覽器緩存,看看還能否繼續訪問即可。

如果以上兩種情況都不是…那很抱歉,我只能幫到這裡了…

謝謝。


我跟樓主遇到了一樣的問題。我這邊伺服器的架構是負載均衡到兩台nginx伺服器,然後分別反向代理到兩台應用伺服器,其中一台節點正常,另外一台tomcat就出現了假死的情況,接受不到客戶的請求,請求可以到nginx伺服器。


用探針找出問題代碼,用sonar讓你的團隊經常優化代碼,清除技術債務,容器久了出現處理請求反應越來越慢,甚至假死,這大多數是內存泄露的問題,原因一般都是閉環代碼造成,這些問題代碼會一直佔用內存不釋放,隨著客戶端不停的調用,會new起來越多,佔用越來越多內存。你要麼用nginx負載均衡,這樣可以交替重啟你的tomcat,不影響用戶使用,然後逐漸優化你的代碼


1.判斷當前請求量多少,是不是發生了請求在伺服器端的堆積

2.試一下其他介面,看一下是不是全局性的問題

3.查看當前伺服器,資料庫的表現,是不是資源被佔滿,

4.查看jvm當前表現,是否在進行gc或者ful gc,再繼續看當前jvm的內存情況,是否發生了佔滿或者溢出

5,換台伺服器試一下,是不是伺服器配置有問題


有可能內存泄露。。或者有流沒關閉等等


首先你要排查下你的靜態頁面是不是使用了瀏覽器緩存。其次,在處理表單請求那段代碼里打個斷點看下請求有沒進來。也可以查看下目前跟tomcat保持連接狀態的請求也多少個(tomcat有個流空,默認是200)。然後具體情況具體分析


推薦閱讀:

web項目上線之前需要注意什麼問題?
什麼樣的項目才會考慮使用JBoss、WebSphere、WebLogic等伺服器?
adt-bundle-windows沒有集成tomcat,如何配置tomcat伺服器?網上的教程大多很古老不適用。
Tomcat是如何將JSP代碼編譯成Servlet代碼的?
tomcat中對靜態資源的訪問也會用servlet來處理嗎?

TAG:JSP | ApacheTomcat | JavaWeb |