2016-02-12 1 views
2

Y a-t-il une quantité initiale de mémoire que je devrais définir pour exécuter une application Spring Boot? Par exemple, pour exécuter une application Tomcat/Undertow intégrée, nous pouvons définir une quantité de mémoire typique pour les options -Xms et -Xmx-java.Quantité initiale de mémoire pour exécuter une application Spring Boot

Comment puis-je connaître les valeurs que je dois définir pour exécuter mon application?

Répondre

9

Vous devez exécuter JavaMissionControl ou un autre profileur pour connaître vos besoins en mémoire réels. Vous pouvez exécuter JavaMissionControl sur le serveur sur lequel Java est installé (et dans le chemin d'accès) en exécutant 'jmc' à partir d'une invite de commande, puis en vous connectant à votre machine virtuelle Java locale. Vous pouvez également vous connecter à une machine virtuelle Java distante. Pour plus d'informations, reportez-vous à ce lien: http://www.oracle.com/technetwork/java/javaseproducts/mission-control/index.html

Typiquement ce que je fais est de définir la mémoire max plus élevée que nécessaire, max = 1 Go semble être un bon point de départ. Vous voulez regarder le profil de la mémoire de votre application sur une période d'activité typique. Sachez que lorsque vous définissez une taille de segment de mémoire initiale de 64 Mo, le garbage collector exécute un schéma qui ne démarre pas une récupération de place majeure tant que cela n'est pas nécessaire pour des raisons de performances (la récupération de place est coûteuse). En conséquence, vous verrez la mémoire grimper dans le temps à environ 80% de la taille du tas (ce% est réglable). Une fois le seuil atteint, la collecte des ordures entre en jeu et vous verrez que la mémoire JVM utilisée est encore très faible.

Normalement, ce que je cherche, c'est le niveau de mémoire qui est utilisé de manière cohérente après une série de grandes collectes de place. Ainsi, après avoir exécuté votre application, vous voyez que l'utilisation de la mémoire SSD après une collecte majeure de la mémoire tombe constamment autour de 40 Mo. Par conséquent, je vais généralement définir la taille de la JVM min autour de ce montant, car je sais que j'ai toujours besoin d'au moins autant que possible.

Maintenant que vous connaissez un point de départ décent pour votre exigence minimale, quelle serait la mémoire maximale nécessaire? Eh bien, cela prend un peu plus de profilage et d'essais et d'erreurs. Ce que je fais est de commencer à réduire le réglage de la mémoire maximale inférieure et le profil pendant un moment. Ce que vous cherchez, c'est la fréquence des principales collectes de déchets et l'utilisation de l'UC JVM atteignant des valeurs élevées.

Je réduirais continuellement la mémoire jusqu'à ce que je constate que la récupération de place importante se produit plusieurs fois dans une courte période sous une charge et que le processeur augmente pendant ces périodes de récupération de place. Une fois que je vois ce comportement, j'augmente lentement la mémoire max jusqu'à ce que ce comportement s'arrête, pour trouver le point idéal de la mémoire max nécessaire.

Ceci est un moyen très simple de trouver des valeurs raisonnables pour les paramètres de mémoire min/max, et fonctionne très bien pour moi dans la plupart des scénarios d'application courants. Il existe bien entendu de nombreuses autres méthodes plus exhaustives pour profiler votre application afin d'affiner à la fois le paramétrage de la mémoire et les schémas/paramètres de récupération de place si vous souhaitez vraiment affiner vos exigences.

+0

Si je ne mets pas de Xms et Xmx, l'application récupère le tas par défaut de Java Solaris avec InitialHeapSize: = 67108864 (64Mb) et MaxHeapSize: = 1073741824 (1GB). La commande "prstat -a" montre que l'application utilise presque tout (774Mb). En même temps, si je définis -Xms128m -Xmx128m l'application fonctionne bien non plus, alors c'est ma question comment trouver la bonne quantité de mémoire pour cela? Parce que je ne suis pas en train de faire quoi que ce soit, java utilise beaucoup plus que ce dont j'ai besoin. –

+0

Je crois que c'est ce que je décris dans ma réponse ... comment déterminer les bonnes valeurs pour Xms et Xmx. – pczeus

+0

Mais y a-t-il une raison pour laquelle Java utilise presque tous les maxheap disponibles (1GB) si Xmx n'est pas défini, et en même temps si réglé 128Mb l'application fonctionne bien aussi? –

1

La quantité maximale de mémoire dont vous avez besoin dépend presque entièrement de votre application et de la charge qu'elle doit pouvoir gérer. L'utilisation d'un outil comme JMeter pour simuler une charge est une façon de voir combien de mémoire est nécessaire. La quantité minimale de mémoire dépend également de votre application, mais vous devez disposer d'au moins 25 Mo environ. This blog post fournit beaucoup d'informations supplémentaires.

+0

Si je ne mets pas de Xms et Xmx, l'application récupère le tas par défaut de Java Solaris avec InitialHeapSize: = 67108864 (64Mb) et MaxHeapSize: = 1073741824 (1GB). La commande "prstat -a" montre que l'application utilise presque tout (774Mb). En même temps, si je définis -Xms128m -Xmx128m l'application fonctionne bien non plus, alors c'est ma question comment trouver la bonne quantité de mémoire pour cela? Parce que ne rien paramétrer java s'exécute en utilisant beaucoup plus que nécessaire. –

0

Habituellement je launcha jar sans drapeaux et de commencer à surveiller par 'Java VisualVM'. Basé sur des données réelles, je définis -Xmx. Comme ça.