J'ai une application Spring Boot. J'ai ajouté beaucoup de dépendances (malheureusement, j'ai besoin de toutes) et le temps de démarrage a beaucoup augmenté. Faire juste un SpringApplication.run(source, args)
prend 10 secondes.
Bien que ce ne soit peut-être pas grand-chose par rapport à ce à quoi on est «habitué», je ne suis pas content que cela en prenne autant, principalement parce que cela rompt le flux de développement. L'application elle-même est plutôt petite à ce stade, je suppose donc que la plupart du temps est liée aux dépendances ajoutées, pas aux classes d'application elles-mêmes.
Je suppose que le problème est l'analyse du chemin de classe, mais je ne sais pas comment:
- Confirmez que c'est le problème (c'est-à-dire comment «déboguer» Spring Boot)
- Si c'est vraiment la cause, comment puis-je la limiter, pour qu'elle soit plus rapide? Par exemple, si je sais qu'une dépendance ou un package ne contient rien que Spring devrait analyser, y a-t-il un moyen de limiter cela?
Je suppose que l' amélioration de Spring pour avoir l'initialisation du bean parallèle au démarrage accélérerait les choses, mais cette demande d'amélioration est ouverte depuis 2011, sans aucun progrès. Je vois d'autres efforts dans Spring Boot lui-même, tels que les améliorations de la vitesse Investigate Tomcat JarScanning , mais cela est spécifique à Tomcat et a été abandonné.
Cet article:
bien que destiné aux tests d'intégration, suggère d'utiliser lazy-init=true
, mais je ne sais pas comment appliquer cela à tous les beans dans Spring Boot en utilisant la configuration Java - des pointeurs ici?
Toute (autre) suggestion serait la bienvenue.
la source
@ComponentScan
ceux-ci, ils sont également analysés. Une autre chose est de vous assurer que vous n'avez pas activé la journalisation de débogage ou de trace car la journalisation est généralement lente, très lente.Réponses:
Spring Boot effectue de nombreuses configurations automatiques qui peuvent ne pas être nécessaires. Vous souhaiterez peut-être limiter uniquement la configuration automatique nécessaire à votre application. Pour voir la liste complète de la configuration automatique incluse, exécutez simplement la journalisation
org.springframework.boot.autoconfigure
en mode DEBUG (logging.level.org.springframework.boot.autoconfigure=DEBUG
inapplication.properties
). Une autre option consiste à exécuter l'application Spring Boot avec l'--debug
option:java -jar myproject-0.0.1-SNAPSHOT.jar --debug
Il y aurait quelque chose comme ça dans la sortie:
Inspectez cette liste et incluez uniquement les configurations automatiques dont vous avez besoin:
Le code a été copié à partir de ce billet de blog .
la source
La réponse la plus votée jusqu'à présent n'est pas fausse, mais elle ne va pas dans la profondeur que j'aime voir et ne fournit aucune preuve scientifique. L'équipe Spring Boot a effectué un exercice pour réduire le temps de démarrage de Boot 2.0, et le ticket 11226 contient de nombreuses informations utiles. Il existe également un ticket 7939 permettant d'ajouter des informations de synchronisation à l'évaluation des conditions, mais il ne semble pas avoir d'ETA spécifique.
L'approche la plus utile et la plus méthodique pour déboguer le démarrage du démarrage a été réalisée par Dave Syer. https://github.com/dsyer/spring-boot-startup-bench
J'avais également un cas d'utilisation similaire, alors j'ai pris l'approche de Dave en matière de micro-benchmarking avec JMH et j'ai couru avec. Le résultat est le projet boot-benchmark . Je l'ai conçu de telle sorte qu'il puisse être utilisé pour mesurer le temps de démarrage de toute application Spring Boot, en utilisant le fichier jar exécutable produit par la tâche Gradle
bootJar
(précédemment appeléebootRepackage
dans Boot 1.5). N'hésitez pas à l'utiliser et à fournir des commentaires.Mes conclusions sont les suivantes:
-XX:TieredStopAtLevel=1
cela ralentirait probablement votre première demande.la source
minimal
, ou le pot peut-il simplement être fourni? J'ai essayé de faire le premier mais je ne suis pas allé très loin.-Xverify:none
en production car cela interrompt la vérification du code et vous pouvez rencontrer des problèmes.-XX:TieredStopAtLevel=1
est OK si vous exécutez une application pour une courte durée (quelques secondes) sinon elle sera moins productive car elle fournira à la JVM des optimisations de longue durée.Use of -Xverify:none is unsupported.
ce que cela signifie?Spring Boot 2.2.M1 a ajouté une fonctionnalité pour prendre en charge l'initialisation paresseuse dans Spring Boot.
Par défaut, lorsqu'un contexte d'application est en cours d'actualisation, chaque bean du contexte est créé et ses dépendances sont injectées. En revanche, lorsqu'une définition de bean est configurée pour être initialisée paresseusement, elle ne sera pas créée et ses dépendances ne seront pas injectées tant qu'elles ne seront pas nécessaires.
Activation de l'initialisation différée définie
spring.main.lazy-initialization
sur trueQuand activer l'initialisation différée
l'initialisation paresseuse peut offrir des améliorations significatives dans le temps de démarrage, mais il y a aussi des inconvénients notables et il est important de l'activer avec précaution
Pour plus de détails, veuillez consulter Doc
la source
Comme décrit dans cette question / réponse, je pense que la meilleure approche consiste à au lieu d'ajouter uniquement celles dont vous pensez avoir besoin, d'exclure les dépendances dont vous savez que vous n'avez pas besoin.
Voir: Réduire le temps de démarrage de Spring Boot
En résumé:
Vous pouvez voir ce qui se passe sous les couvertures et activer la journalisation du débogage aussi simplement que de spécifier --debug lors du démarrage de l'application à partir de la ligne de commande. Vous pouvez également spécifier debug = true dans votre application.properties.
En outre, vous pouvez définir le niveau de journalisation dans application.properties aussi simplement que:
logging.level.org.springframework.web: DEBUG logging.level.org.hibernate: ERREUR
Si vous détectez un module auto-configuré dont vous ne voulez pas, il peut être désactivé. La documentation pour cela peut être trouvée ici: http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#using-boot-disabling-specific-auto-configuration
Un exemple ressemblerait à ceci:
la source
Eh bien, il y a toute la liste des actions possibles décrites ici: https://spring.io/blog/2018/12/12/how-fast-is-spring
Je vais mettre les notes les plus importantes du côté Spring (ajusté un peu):
spring.config.location
(argument de ligne de commande ou propriété système, etc.). Exemple pour tester en IDE:spring.config.location=file://./src/main/resources/application.properties
.spring.jmx.enabled=false
(c'est la valeur par défaut dans Spring Boot 2.2)spring.main.lazy-initialization=true
dans Spring Boot 2.2 (à utiliserLazyInitBeanFactoryPostProcessor
pour les versions Spring plus anciennes).-noverify
. Considérez également-XX:TieredStopAtLevel=1
(cela ralentira le JIT plus tard au détriment du temps de démarrage enregistré).Le mentionné
LazyInitBeanFactoryPostProcessor
(vous pouvez l'utiliser pour Spring 1.5 si vous ne pouvez pas appliquer le drapeauspring.main.lazy-initialization=true
disponible à partir du printemps 2.2):Vous pouvez également utiliser (ou écrire le vôtre - c'est simple) quelque chose pour analyser le temps d'initialisation des beans: https://github.com/lwaddicor/spring-startup-analysis
J'espère que ça aide!
la source
Dans mon cas, il y avait trop de points d'arrêt. Lorsque j'ai cliqué sur "Mute Breakpoints" et redémarré l'application en mode débogage, l'application a démarré 10 fois plus rapidement.
la source
Si vous essayez d'optimiser la rotation du développement pour les tests manuels, je recommande fortement l'utilisation de devtools .
Recompilez simplement - et le serveur redémarrera (pour Groovy, il vous suffit de mettre à jour le fichier source). si vous utilisez un IDE (par exemple 'vscode'), il peut compiler automatiquement vos fichiers java, donc le simple fait d'enregistrer un fichier java peut initier un redémarrage du serveur, indirectement - et Java devient tout aussi transparent que Groovy à cet égard.
La beauté de cette approche est que le redémarrage incrémentiel court-circuite certaines des étapes de démarrage à partir de zéro - de sorte que votre service sera de nouveau opérationnel beaucoup plus rapidement!
Malheureusement, cela n'aide pas avec les temps de démarrage pour le déploiement ou les tests unitaires automatisés.
la source
AVERTISSEMENT: Si vous n'utilisez pas Hibernate DDL pour la génération automatique de schéma de base de données et que vous n'utilisez pas le cache L2, cette réponse ne vous concerne PAS. Faites défiler vers l'avant.
Ma conclusion est que Hibernate ajoute un temps considérable au démarrage de l'application. La désactivation du cache L2 et de l' initialisation de la base de données accélère le démarrage de l'application Spring Boot. Laissez le cache activé pour la production et désactivez-le pour votre environnement de développement.
application.yml:
Résultats de test:
Le cache L2 est activé et
ddl-auto: update
Le cache L2 est désactivé et
ddl-auto: none
Maintenant je me demande ce que je vais faire de tout ce temps libre
la source
Je trouve étrange que personne n'ait suggéré ces optimisations auparavant. Voici quelques conseils généraux sur l'optimisation de la construction et du démarrage du projet lors du développement:
AVERTISSEMENTS
la source
Pour moi, il semble que vous utilisez un mauvais paramètre de configuration. Commencez par vérifier myContainer et les éventuels conflits. Pour déterminer qui utilise le plus de ressources, vous devez vérifier les cartes mémoire (voir la quantité de données!) Pour chaque dépendance à la fois - et cela prend également beaucoup de temps ... (et les privilèges SUDO). Au fait: testez-vous généralement le code par rapport aux dépendances?
la source