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
然后观察一段时间吧。