J'utilise Spring Boot pour développer une application cliente. et lors de l’exécution de l’application Spring Boot (à l’aide du fichier jar entièrement exécutable), la mémoire utilisée est d’environ 190 Mo sur un serveur x64 et 110 M sur un serveur x86.
mon option jvm est (-Xmx64M -Xms64M -XX: MaxPermSize = 64M-server), Pourquoi, sur un serveur x64, la mémoire utilisée est-elle si grosse? Comment réduire l'utilisation de la mémoire en dessous de 150 M?
merci.
Je suis un peu en retard au jeu ici, mais j’ai eu le même problème avec une application conteneurisée Spring Boot sur Docker. Le minimum que vous obtiendrez est environ 72 millions de mémoire totale sur la plus simple des applications Spring Boot avec un seul contrôleur et Tomcat intégré. Jetez dans Spring Data REST, Spring Security et quelques entités JPA et vous obtiendrez un minimum de 200M-300M. Vous pouvez obtenir une application Spring Boot simple jusqu’à environ 72 M au total en utilisant les options JVM suivantes.
With-XX:+UseSerialGC
Ceci effectuera une récupération de place en ligne avec le thread allouant la mémoire de tas au lieu d'un ou plusieurs threads GC dédiés.
With-Xss512k
Ceci limitera la mémoire de pile de chaque thread à 512 Ko au lieu des 1 Mo par défaut
With-XX:MaxRAM=72m
Ceci limitera les calculs de la machine virtuelle Java pour la mémoire gérée tas et non tas, dans les limites de cette valeur.
En plus des options JVM ci-dessus, vous pouvez également utiliser la propriété suivante dans votre fichier application.properties
:
server.Tomcat.max-threads=5
Ceci limitera le nombre d'unités d'exécution du gestionnaire de demandes HTTP à 1 (la valeur par défaut est 50).
Voici un exemple de docker stats
exécutant une application Spring Boot very simple avec les limites ci-dessus et avec l'argument de docker -m 72m
. Si je diminue les valeurs inférieures, je ne peux pas démarrer l'application.
83ccc9b2156d: Mem Usage: 70.36MiB / 72MiB | Mem Percentage: 97.72%
Et ici, vous pouvez voir une ventilation de toutes les mémoires de mémoire natives et Java à la sortie.
Native Memory Tracking:
Total: reserved=1398681KB, committed=112996KB
- Java Heap (reserved=36864KB, committed=36260KB)
(mmap: reserved=36864KB, committed=36260KB)
- Class (reserved=1086709KB, committed=43381KB)
(classes #7548)
( instance classes #7049, array classes #499)
(malloc=1269KB #19354)
(mmap: reserved=1085440KB, committed=42112KB)
( Metadata: )
( reserved=36864KB, committed=36864KB)
( used=36161KB)
( free=703KB)
( waste=0KB =0.00%)
( Class space:)
( reserved=1048576KB, committed=5248KB)
( used=4801KB)
( free=447KB)
( waste=0KB =0.00%)
- Thread (reserved=9319KB, committed=938KB)
(thread #14)
(stack: reserved=9253KB, committed=872KB)
(malloc=50KB #74)
(arena=16KB #26)
- Code (reserved=248678KB, committed=15310KB)
(malloc=990KB #4592)
(mmap: reserved=247688KB, committed=14320KB)
- GC (reserved=400KB, committed=396KB)
(malloc=272KB #874)
(mmap: reserved=128KB, committed=124KB)
- Compiler (reserved=276KB, committed=276KB)
(malloc=17KB #409)
(arena=260KB #6)
- Internal (reserved=660KB, committed=660KB)
(malloc=620KB #1880)
(mmap: reserved=40KB, committed=40KB)
- Symbol (reserved=11174KB, committed=11174KB)
(malloc=8417KB #88784)
(arena=2757KB #1)
- Native Memory Tracking (reserved=1858KB, committed=1858KB)
(malloc=6KB #80)
(tracking overhead=1852KB)
- Arena Chunk (reserved=2583KB, committed=2583KB)
(malloc=2583KB)
- Logging (reserved=4KB, committed=4KB)
(malloc=4KB #179)
- Arguments (reserved=17KB, committed=17KB)
(malloc=17KB #470)
- Module (reserved=137KB, committed=137KB)
(malloc=137KB #1616)
Ne vous attendez pas à une performance décente, car j'imagine que le GC fonctionnerait fréquemment avec cette configuration car il ne dispose pas de beaucoup de mémoire disponible pour jouer.
Après la recherche, j’ai trouvé qu’il avait déjà une réponse dans stackoveflow . La consommation de mémoire de Spring Boot dépasse l’option -Xmx
1. Number of http threads (Undertow starts around 50 threads per default, but you can increase / decrease via property the amount of threads needed)
2. Access to native routines (.dll, .so) via JNI
3. Static variables
4. Use of cache (memcache, ehcache, etc)
If a VM is 32 bit or 64 bit, 64 bit uses more memory to run the same application, so if you don't need a heap bigger than 1.5GB, so keep your application runnnig over 32 bit to save memory.
spring Boot démarre environ 50 threads par défaut pour le service http (Tomcat ou Undertow, Jetty) et utilise 1 Mo par thread (paramètre par défaut de 64 bits JVM).
Ainsi, dans la taille 64 bits, la mémoire utilisée est de ___.
références:
Vous pouvez utiliser -XX: + UseSerialGC comme argument JVM pour spécifier le collecteur de déchets série, qui constitue le meilleur choix pour réduire le tas de mémoire.