开发者社区> 问答> 正文

如何让Tomcat GC的之前,自动从nginx的upstream摘除,避免超时?

tomcat会隔一段时间就进行一次fullgc,这时候如果nginx发送请求过来,就会导致请求超时.

有一种解决方案是在nginx端设置一个较短的超时时间,如果没有返回,就重新换一台机器重发请求,但是问题是这个请求是由副作用的,不允许重复发生

所有想问一下,有没有一个机制,在tomcat gc之前,nginx自动将其摘除,gc完成之后,再自动加回来

总之,就是避免tomcat gc造成的超时影响~

PS:

nginx的upstream设置了多台tomcat,只要一台发生了gc,所有落在这台机器的请求都会超时.

展开
收起
小旋风柴进 2016-03-04 11:35:07 3169 0
2 条回答
写回答
取消 提交回答
  • 1、根本上需要解决fullgc的问题,理论上不能出现fullgc,但是可以出现cms gc等。

    加入机器是4核的,8GB内存的,gc可以这样配置比较均衡。要求jdk7以上
     -server 
     -Xms4096m 
     -Xmx4096m 
     -XX:MetaspaceSize=512m 
     -XX:MaxMetaspaceSize=512m 
     -Xmn20486m 
     -XX:+UseConcMarkSweepGC 
     -XX:+UseCMSCompactAtFullCollection 
     -XX:CMSMaxAbortablePrecleanTime=5000 
     -XX:+CMSClassUnloadingEnabled 
     -XX:+UseCMSInitiatingOccupancyOnly 
     -XX:CMSInitiatingOccupancyFraction=82 
     -XX:+HeapDumpOnOutOfMemoryError 
     -XX:HeapDumpPath=/home/admin/java/java.hprof 
     -Xloggc:/home/admin/java/gc.log 
     -XX:+PrintGCDetails 
     -XX:+PrintGCDateStamps 
     -XX:MaxDirectMemorySize=1g 
     -XX:SurvivorRatio=10 
     -XX:+ExplicitGCInvokesConcurrent 
     -XX:ParallelGCThreads=4 

    2、如果实在找不到。

      每天定义跑个任务,先从nginx的upstream配置里摘掉后端tomcat,然后nginx reload,然后重启tomcat,等tomcat启动好了,再修改nginx upstream,追加tomcat,再nginx reload。

    3、nginx有模块,自动检测后端tomcat是否可用,如果没有心跳,可以自动摘掉。

    2019-07-17 18:52:01
    赞同 展开评论 打赏
  • tomcat有个防止内存溢出的监听器:

    org.apache.catalina.core.JreMemoryLeakPreventionListener
    我怀疑是它调System.gc()导致的,而这种GC可能是用的stop the world方式,也就是说是非并发的。你可以试一下下面两种方案:

    1.-XX:+ExplicitGCInvokesConcurrent 并发GC
    2.停用该监听器或者从JVM级别禁用直接调用-XX:+DisableExplicitGC

    然后观察一段时间吧。

    2019-07-17 18:52:01
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
《Nginx 代理系统常用手册》 立即下载
CentOS Nginx PHP JAVA 多语言镜像使用手 立即下载
CentOS Nginx PHP JAVA多语言镜像使用手册 立即下载