Tomcat führt von Zeit zu Zeit FullGC aus. Wenn Nginx zu diesem Zeitpunkt eine Anfrage sendet, kommt es zu einer Zeitüberschreitung der Anfrage.
Eine Lösung besteht darin, eine kürzere Zeitüberschreitung auf der Nginx-Seite festzulegen, die Maschine so zu ändern, dass sie die Anfrage erneut sendet. Das Problem besteht jedoch darin, dass diese Anfrage nicht erneut erfolgen darf
Ich möchte fragen: Gibt es einen Mechanismus, mit dem Nginx Tomcat automatisch vor GC entfernt und es nach Abschluss von GC automatisch wieder hinzufügt?Kurz gesagt, es geht darum, die durch Tomcat GC verursachten Timeout-Auswirkungen zu vermeiden
PS:Der Upstream von nginx ist mit mehreren Tomcats eingerichtet. Solange ein GC auf einem Computer auftritt, kommt es bei allen auf diesem Computer eingehenden Anfragen zu einer Zeitüberschreitung.
tomcat有个防止内存溢出的监听器:
我怀疑是它调System.gc()导致的,而这种GC可能是用的stop the world方式,也就是说是非并发的。你可以试一下下面两种方案:
1.-XX:+ExplicitGCInvokesConcurrent 并发GC
2.停用该监听器或者从JVM级别禁用直接调用-XX:+DisableExplicitGC
然后观察一段时间吧。