29 votes

Pourquoi la JVM de ces serveurs Tomcat effectue-t-elle une GC complète toutes les heures ?

Nous exploitons de nombreux serveurs Tomcat et avons observé que les garbage collections (GC) complètes sont souvent effectuées toutes les heures, en particulier lorsque l'utilisation de la mémoire est relativement faible. L'heure précise semble être relative à l'heure de démarrage du serveur d'application ; si un serveur est démarré à 01:13, une GC complète est effectuée à 02:13, et la prochaine GC complète aura lieu à 03:13. Je n'ai pas pu trouver de documentation expliquant ce comportement.

C'est un problème car un pool de serveurs démarrés simultanément ont tous tendance à faire des GC complets à peu près en même temps. Si le retard de GC est suffisamment long pour qu'un équilibreur de charge marque un serveur comme étant hors service, toute l'application peut être mise hors service pendant un certain temps. Il serait préférable que les GC complètes soient réparties sur une période de sorte que deux serveurs ne fassent pas une GC complète en même temps, mais je ne trouve aucun moyen de contrôler ce comportement.

Quelqu'un d'autre a-t-il constaté ce comportement ? Existe-t-il un moyen d'influer sur le moment où ces CG complètes "normales" se produisent ?

25voto

JoshDM Points 2567

Vos CG horaires "normales" sont probablement dues à ce bogue connu , " Le JreMemoryLeakPreventionListener provoque un GC complet toutes les heures lorsque gcDaemonProtection=true ".

Confirmez vos versions de Tomcat et la valeur de l'option gcDaemonProtection propriété de votre JreMemoryLeakPreventionListener (la valeur par défaut est true ).

Le correctif aurait été inclus dans Tomcat v.7.0.28+ et v.6.0.36+.

Vous pouvez soit mettre à niveau votre ou vos serveurs, soit choisir une solution sans mise à niveau parmi les suivantes aquí résumée comme suit :

  1. supprimer les collectes de déchets complets en utilisant les arg de la JVM -XX:+DisableExplicitGC
  2. conserver les GC complètes, mais s'en remettre au collecteur CMS en utilisant les arg de la JVM -XX:+ExplicitGCInvokesConcurrent
  3. set <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" gcDaemonProtection="false"/>
  4. Désactiver l'écouteur

Il faut rendre à César ce qui appartient à César ; j'ai obtenu ma réponse initiale de la part de aquí .

3voto

CPU 100 Points 2269

Vous devriez pouvoir modifier l'intervalle en

-Dsun.rmi.dgc.client.gcInterval=60000
-Dsun.rmi.dgc.server.gcInterval=60000

Jetez un coup d'œil ici https://docs.oracle.com/cd/E19199-01/817-2180-10/pt_chap5.html

0voto

Sameer Naik Points 62

@EJP Nous avons dû désactiver gcDaemonProtection et augmenter gcInterval pour nous débarrasser des GC complètes toutes les heures, même si nous n'utilisions pas RMI.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X