10 Options JVM importantes pour le système d'application JAVA de production
Découvrez les principales options JVM (Java Virtual Machine) pour de meilleures performances et un meilleur débogage.
Si vous êtes Développeur Java ou administrateur middleware, vous devez alors savoir ce que signifient les options JVM, leur importance et leur impact sur votre application. Découvrons-les.
Présentation des options JVM
En ce qui concerne les options JVM, il existe trois types d'options que vous pouvez inclure dans votre JVM: options standard, non standard et avancées. Si vous essayez une option avancée, vous utilisez toujours l'option avec -XX
. De même, si vous appliquez une option non standard, vous utilisez -X
. Les options standard ne préfèrent rien à l'option.
Quelles options JVM sont utilisées par votre application?
Si l'application s'exécute sous Linux, vous pouvez utiliser ps -ef | grep java
to identify the Java process and look at the JVM options printed as process arguments. If more than one Java process is going on the system, then you may require to go with a keyword that is unique to your Java application.
Si votre argument est trop long, essayez d'utiliser ps -auxww
car cette commande affichera également une longue liste d'arguments.
Après avoir dressé une liste d'indicateurs JVM, vous pouvez vous faire une idée des comportements de toute application Java, par exemple Tomcat.
Taille du tas Java
-Xms- définir la taille initiale du tas Java -Xmx- définir la taille maximale du tas Java -Xss- définir la taille de la pile de threads java
-Xms - Cette option permet de définir la taille du tas de départ pour JVM, par exemple,Xms2048m
which means an initial heap size of JVM is 2 GB around. So, when a JVM starts, the heap memory will be this much big. Surprisingly yes! This is carried to prevent resizing during startup and enhance the startup time of JVM.
-Xmx - Cette option permet de définir la taille maximale du tas de JVM, par exemple,Xmx2048m
ce qui signifie que la taille maximale du tas de JVM sera de 2 Go uniquement.
You will essentially toujours avoir-Xms
et-Xmx
ensemble.
Définir le pourcentage du tas
-XX: MaxHeapFreeRatio - définit le pourcentage maximum de tas libre après GC pour éviter la réduction.
-XX: MinHeapFreeRatio - définit le pourcentage minimum de tas libre après GC pour éviter l'expansion; pour surveiller l'utilisation du tas, vous pouvez utiliser JCosole.
Activer le partage des données de classe
Spécifier Xshareclasses
option to enable class data sharing in a shared class cache. The JVM connects to an existing cache or creates a cache if one does not exist. You can have multiple caches, and you can specify the correct cache by adding a suboption to the -Xshareclasses
option.
Taille PermGen
Les options JVM antérieures définissent la taille de la mémoire du tas mais -XX:PermSize
consiste à définir la taille de l'espace PermGen, où le pool de chaînes et les métadonnées de classe sont enregistrés. Cette option est particulièrement efficace pour un serveur Web comme Tomcat, qui charge souvent des classes de l'application Web lors du déploiement.
À propos, il convient de savoir que l'espace PermGen est pris en charge par Metaspace dans Java 8, et cette option n'est pas applicable si vous exécutez avec JRE 8 JVM.
Imprimer CG
-verbose: gc - enregistre les exécutions du garbage collector et leur durée. -XX: + ImprimerGCDétails - includes the data from -verbose:gc but also adds information about the size of the new generation and more accurate horaires. -XX: -ImprimerGCTimeStamps - Imprimer les horodatages lors de la collecte des ordures.
These JVM options are used to enable the garbage collection logging, which is highly effective for the latency-sensitive operation. We used to be on systems where we seek for microsecond latencies, and if you recognize, a big garbage collection can last several milliseconds.
So, we go for GC free architecture like LMAX disruptor, but indeed if you are not going for ultra latency-sensitive application, this handy option will advise you important GC statistics. It will get you whether it’s big or minor garbage collection, which kind of garbage collector is applied, how often memory is restored, and how much time it held, etc.
Gestion de l'erreur 'OutOfMemory'
Pour déclencher un vidage de tas en cas de mémoire insuffisante, vous pouvez utiliser -XX:+HeapDumpOnOutOfMemoryError
This JVM option produces a stack dump when your JVM dies with OutOfMemory Error. There is no expense involved unless an OOM really occurs. This flag is a requisite for production systems as it is usually the only way to determine the problem deeply.
The heap dump will be set up in the “current directory” of the JVM by default. If you wish to create heap dumps on specific directory, then run
-XX:HeapDumpPath= [path-to-heap-dump-directory]
-XX:+UseGCOverheadLimit
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
Le fichier de vidage de tas peut être énorme, jusqu'à gigaoctets, alors assurez-vous que le système de fichiers cible autorise une capacité suffisante.
If we want to restart the server immediately after out of memory occur, then we can set this parameter of the same purpose –
XX:OnOutOfMemoryError="shutdown -r"
Tracer le chargement et le déchargement des classes
-XX:+TraceClassLoading
et -XX:+TraceClassUnloading
sont deux options JVM que nous utilisons pour imprimer les informations de journalisation chaque fois que les classes se chargent dans JVM ou se déchargent de JVM. Ces indicateurs JVM sont utiles si vous avez un type de fuite de mémoire lié au chargeur de classe et que vous soupçonnez que les classes ne sont pas en cours de déchargement ou de récupération de place.
Chemin de classe Java
Parler de JAVA Classpath alors-Xbootclasspath
specifies classpath entries we want loaded without verification. The JVM verifies all classes it loads to ensure that it don’t try to dereference an object with an int, pop of extra entries off the stack or push too many, and so on.
Mettre la classe sur le bootclasspath évite également le coût, mais ne doit être utilisé que lorsque vous savez que les classes ont été vérifiées plusieurs fois auparavant. Dans JRuby, cela a réduit le temps de démarrage de moitié et plus pour un simple script.
Profilingue
Java Profiling is the process of monitoring various JVM levels parameters such as Method Executions, Thread Executions, Garbage Collections, and Object Creations. Java Profiling provides you with a finer view of your target application execution and its resource utilization, as well.
-Xprof
-Xrunhprof
Séries 64-bit sûr, heureux et sain
In the OS environment where both 32 and 64-bit packages are installed, the JVM automatically chooses 32-bit environmental packages as default.
If we want to set the environment to 64 bit manually, we can do so using -d<OS bit>
parameter. And obviously, the OS bit peut être 32 ou 64.
Conclusion
J'espère que cela vous aidera à configurer les paramètres JVM pour votre application. Si vous souhaitez en savoir plus sur la gestion de la mémoire java, consultez ceci Cours Udemy.