17 Stimmen

Was ist der beste Weg, um den Spring-Container zu profilieren, um zu lernen, wie man seine Startzeit optimiert?

Ich habe eine Anwendung, die ziemlich groß wird, und die Spring-Startzeit beträgt etwa 20 Sekunden. Für die Produktion ist das in Ordnung, aber für die Entwicklung ist das ein großes Ärgernis.

Was ist ein gutes Profiling-Tool oder -Ansatz, das mir genau die Informationen geben kann, die ich brauche, um herauszufinden, was so lange dauert? Vielleicht ist es etwas, das ich optimieren kann?

Meine Anwendung ist eine ziemlich typische Spring/Hibernate-Webanwendung. Es gibt etwa 50 Datenbanktabellen und mehrere hundert Beans (so etwa 200-300... ich habe nicht gezählt). Es gibt ein paar @Configurable Beans. Viel Komponentenscan. Ich benutze auch Spring Security.

Ich habe ein paar primitive Profiling mit Log4j gemacht - nur mit der INFO-Einstellung. Hier sind einige Dinge, die ein wenig Zeit in Anspruch nehmen:

  • INFO DefaultListableBeanFactory:555 - Pre-instantiating singletons - 2 Sekunden
  • INFO SessionFactoryImpl:202 - Session-Factory erstellen - 2 Sekunden
  • INFO HibernateTransactionManager:415 - Verwendung von DataSource [com.mchange.v2.c3p0.ComboPooledDataSource......] der Hibernate SessionFactory für HibernateTransactionManager - 7 Sekunden

Es gibt ein paar Dinge, die 0,5 bis vielleicht maximal 1 Sekunde dauern, aber diese 3 waren die größten.

1voto

Aravind Yarram Punkte 76365

Eine Option, die Sie ausprobieren können, ist die Verwendung der default-lazy-init Option, um die Beans verzögert zu initialisieren. Spring initialisiert alle Singleton-Scoped Beans während der Initialisierung. Lesen Sie den Abschnitt Lazy-instantiated Beans der Referenzdokumentation.

Stellen Sie sicher, dass Sie den Wert parametrisieren, damit Sie ihn während der Entwicklung auf true und während des Productionsdeployments auf false ändern können.

Das Komponenten-Scannen ist langsam. Lesen Sie diesen Beitrag, wie Sie dies deaktivieren können, wenn Sie Autowiring verwenden.

0voto

Spina Punkte 8706

Ich bin traurig, dass bisher alle Antworten sich darauf konzentrieren, die Leistung zu verbessern, aber keine davon hilft Ihnen tatsächlich bei der Analyse. Ich habe YourKit mit großem Erfolg bei anderen Profiling-Problemen verwendet, kann jedoch nicht über dessen Nützlichkeit beim Starten von Spring sprechen.

Ich hatte guten Erfolg damit, meine Spring-Konfiguration in separate Dateien aufzuteilen und nur die Dateien zu laden, die für einen bestimmten Test benötigt werden. Das funktioniert besonders gut für mich, weil ich Camel verwende, das teuer ist, um zu starten und von den meisten meiner Tests nicht verwendet wird. Ich verwende H2, damit ich Tests meiner DAOs + Services gegen eine Datenbank ausführen kann, ohne komplexe Start- /Shutdown-Vorgänge durchführen zu müssen (obwohl es eine Weile gedauert hat, alles erfolgreich miteinander zu verbinden). Ich habe jedoch immer noch ein Problem beim Starten der gesamten App für interaktives Testen. Es ist auch für mich langsam.

-1voto

Ralph Punkte 114913

20 Sekunden, um die Anwendung zu starten. das spielt keine Rolle. Wichtig ist die Zeit, die du benötigst, um deine Testfälle auszuführen!

  • Schreibe also deine Tests mit Mocks, die überhaupt keinen Spring-Start benötigen.
  • Für integrationstests, versuche die Konfiguration aufzuteilen, sodass nur die Beans initialisiert werden, die für eine Gruppe von Tests benötigt werden.

-1voto

lalit Punkte 1487

Sie können auch Spring Insight verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X