Erfahrung in der Lösung von Tomcat-Speicherüberlaufproblemen

Erfahrung in der Lösung von Tomcat-Speicherüberlaufproblemen

Vor einiger Zeit habe ich Testern eine Produktversion zum Testen vorgelegt und die Testergebnisse waren einfach unerwartet!

Nach einer Weile des Testens blieb die Seite hängen. Aufgrund dieses Phänomens vermutete ich unbewusst, dass sie auf der Datenbankebene hängen blieb. Dann überprüfte ich die Parameter im Zusammenhang mit der Datenbankverbindung. Wie erwartet war die Anzahl der Verbindungen zu groß! Nachdem ich das Problem mit der Datenbankverbindungsnummer gelöst hatte, dachte ich, der Fehler sei behoben, aber ...

Nach längerem Testen blieb die Seite erneut hängen! ! !

Ich habe den Task-Manager geöffnet und festgestellt, dass der Tomcat-Speicher 1,5 GB überschritt und Tomcat nicht heruntergefahren werden konnte! Was ist die Ursache? Nachdem ich darüber nachgedacht hatte, fiel mir ein Punkt ein, der möglicherweise zu einer Vergrößerung des Tomcat-Speichers führt, nämlich Multithreading. Dann sah ich mir den Code für die Konfiguration des Thread-Pools an und fand nichts Verdächtiges.

Dann lösen wir zuerst das Problem, dass Tomcat nicht heruntergefahren werden kann. Baidu ... hat den Code überprüft ... und nach Dutzenden von Minuten festgestellt. Der Thread-Pool wurde in der Zerstörungsmethode (contextDestroyed) des Tomcat-Listeners nicht geschlossen. In diesem Fall kann Tomcat nicht heruntergefahren werden, da der Thread-Pool nicht geschlossen werden kann.

Ändern Sie den Code wie folgt:

öffentliche Klasse InitListener implementiert ServletContextListener {
  privater Logger logger = Logger.getLogger(InitListener.class);
  @Überschreiben
  public void KontextInitialisiert(ServletContextEvent sce) {
    logger.info("Tomcat starten");
  }
  @Überschreiben
  öffentliche Leere Kontext zerstört (ServletContextEvent sce) {
    logger.info("Tomcat schließen, Thread-Pool schließen");
    ClassPathXmlApplicationContext classPathXmlApplicationContext = neuer ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
    ThreadPoolTaskExecutor myTaskExecutor = (ThreadPoolTaskExecutor) classPathXmlApplicationContext.getBean("myTaskExecutor");
    myTaskExecutor.shutdown();
  }
}

Nun, das Problem, dass Tomcat nicht heruntergefahren werden konnte, wurde gelöst.

Lösen Sie als Nächstes das Problem des Speicherüberlaufs (siehe zuerst das Protokoll):

Beim Überprüfen des Tomcat-Protokolls habe ich festgestellt, dass die Spring-Konfigurationsdatei der Hintergrundschnittstelle bei jedem Aufruf durch die Seite initialisiert wird. Das heißt, Spring fügt die Bean bei jeder Anforderung erneut ein und der belegte Speicher wird nicht wiederverwendet!

Dann habe ich mich gefragt, wann die Spring-Konfigurationsdatei initialisiert wird: wenn Tomcat gestartet wird; wenn das Schlüsselwort new verwendet wird, das heißt,

ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");

Dann habe ich den Code global durchsucht und tatsächlich habe ich ihn im Filter gefunden. Jedes Mal, wenn eine Schnittstelle kam, wurde ein neues Objekt erstellt. Was für ein schrecklicher Code! Ich habe mich in meinem Herzen immer wieder für das verflucht, was ich damals gedacht habe! Ich werde diese Erfahrung als Warnung betrachten und sie aufschreiben, um mir selbst zu sagen, dass ich in Zukunft ähnliche Fehler nicht noch einmal machen werde.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • So lösen Sie das Problem des Tomcat-Speicherüberlaufs unter Linux
  • Die perfekte Lösung für Tomcat-Speicherüberlauf
  • Implementierungsmethode für TOMCAT-Speicherüberlauf und Größenanpassung
  • Eine Lösung für den Tomcat-Speicherüberlauf, der durch eine JSP-Seite verursacht wird
  • Methode zum Einstellen des Speicherüberlaufs bei der Installationsversion Tomcat6.0/7.0
  • Analyse und Lösung des Tomcat-Speicherüberlaufs

<<:  Die Fallstricke und Lösungen, die durch den Standardwert von sql_mode in MySQL 5.7 verursacht werden

>>:  Detaillierte Erläuterung der Ausführungsreihenfolge der JavaScript-Alarmfunktion

Artikel empfehlen

So installieren Sie den Zookeeper-Dienst auf einem Linux-System

1. Erstellen Sie den Ordner /usr/local/services/z...

CentOS 7-Methode zum Ändern des Gateways und Konfigurieren des IP-Beispiels

Wählen Sie bei der Installation der CentOS7-Versi...

Lassen Sie IE6, IE7, IE8 CSS3-abgerundete Ecken und Schattenstile unterstützen

Ich möchte eine Seite mit CSS3-abgerundeten Ecken...

Lernen Sie die Grundlagen von nginx

Inhaltsverzeichnis 1. Was ist nginx? 2. Was kann ...

Was sind die Vorteile von MySQL MGR?

MGR (MySQL Group Replication) ist eine neue Funkt...

Detaillierte Beispiele zur Verwendung der Box-Shadow-Eigenschaft in CSS3

CSS enthält viele Attribute. Manche Attribute wer...

So installieren Sie Docker und Portainer in Kali

Mit dem Aufkommen von Docker haben sich viele Die...

Einfache Implementierung zum Ausblenden der Bildlaufleiste in HTML

1. HTML-Tags mit Attributen XML/HTML-CodeInhalt i...

So finden Sie langsame MySQL-Abfragen

Vorwort Ich glaube, dass jeder in seiner tägliche...