tomcat會隔一段時間就進行一次fullgc,這時候如果nginx發送請求過來,就會導致請求超時.
有一個解決方案是在nginx端設定一個較短的超時時間,如果沒有返回,就重新換一台機器重發請求,但是問題是這個請求是由副作用的,不允許重複發生
所有想問一下,有沒有一個機制,在tomcat gc之前,nginx自動將其摘除,gc完成之後,再自動加回來
總之,就是避免tomcat gc造成的超時影響~
PS:
nginx的upstream設定了多台tomcat,只要一台發生了gc,所有落在這台機器的請求都會超時.
tomcat有個防止記憶體溢出的監聽器:
我懷疑是它調System.gc()導致的,而這種GC可能是用的stop the world方式,也就是說是非併發的。你可以試試下面兩種方案:
1.-XX:+ExplicitGCInvokesConcurrent 並發GC
2.停用該監聽器或從JVM等級停用直接呼叫-XX:+DisableExplicitGC
然後觀察一段時間吧。