Mémoire Java Heap Space avec l'API Runtime

1. Vue d'ensemble

Dans cet article, nous discuterons des API fournies par Java qui peuvent nous aider à comprendre les différents aspects liés à l'espace de tas Java.

Cela peut être utile pour comprendre l'état actuel de la mémoire de la JVM et l'externaliser vers des services de surveillance tels que StatsD et Datadog, qui peuvent ensuite être configurés pour prendre des mesures préventives et éviter les échecs d'application.

2. Accès aux paramètres de mémoire

Chaque application Java a une seule instance de java.lang.Runtime qui peut nous aider à comprendre l'état actuel de la mémoire de l'application. La méthode statique Runtime # getRuntime peut être appelée pour obtenir l' instance d' exécution singleton .

2.1. Mémoire totale

La méthode Runtime # getTotalMemory renvoie l'espace total du tas actuellement réservé par la JVM en octets. Il comprend la mémoire réservée aux objets actuels et futurs. Par conséquent, il n'est pas garanti qu'il soit constant pendant l'exécution du programme car l'espace du tas Java peut être étendu ou réduit à mesure que davantage d'objets sont alloués.

En outre, cette valeur n'est pas nécessairement celle utilisée ou la mémoire maximale disponible.

2.2. Mémoire libre

La méthode Runtime # freeMemory renvoie l'espace libre du tas disponible pour les nouvelles allocations d'objets en octets. Il peut augmenter à la suite d'une opération de garbage collection où plus de mémoire libre est disponible après.

2.3. Mémoire maximum

La méthode Runtime # maxMemory renvoie la mémoire maximale que la JVM tentera d'utiliser. Une fois que l'utilisation de la mémoire JVM atteint cette valeur, elle n'allouera pas plus de mémoire et à la place, elle effectuera un garbage collection plus fréquemment.

Si les objets JVM ont encore besoin de plus de mémoire même après l'exécution du garbage collector, la JVM peut lancer une exception d'exécution java.lang.OutOfMemoryErro r.

3. Exemple

Dans l'exemple ci-dessous, nous initialisons une ArrayList et y ajoutons des éléments tout en gardant une trace de l'espace de tas JVM à l'aide des trois méthodes ci-dessus:

ArrayList arrayList = new ArrayList(); System.out.println("i \t Free Memory \t Total Memory \t Max Memory"); for (int i = 0; i < 1000000; i++) { arrayList.add(i); System.out.println(i + " \t " + Runtime.getRuntime().freeMemory() + " \t \t " + Runtime.getRuntime().totalMemory() + " \t \t " + Runtime.getRuntime().maxMemory()); } // ...
Output: i Free Memory Total Memory Max Memory 0 254741016 257425408 3817865216 1 254741016 257425408 3817865216 ... 1498 254741016 257425408 3817865216 1499 253398840 257425408 3817865216 1500 253398840 257425408 3817865216 ... 900079 179608120 260046848 3817865216 900080 302140152 324534272 3817865216 900081 302140152 324534272 3817865216 ...
  • Ligne 1498: la valeur Runtime # freeMemory diminue lorsque suffisamment d'objets se voient allouer de l'espace dans le tas Java.
  • Ligne 900080: À ce stade, la JVM dispose de plus d'espace disponible car GC a exécuté, d'où l' augmentation des valeurs de Runtime # freeMemory et Runtime # totalMemory .

Les valeurs indiquées ci-dessus devraient être différentes à chaque exécution d'une application Java.

4. Personnalisation des paramètres de mémoire

Nous pouvons remplacer les valeurs par défaut des paramètres de mémoire JVM en définissant des valeurs personnalisées sur certains indicateurs lors de l'exécution de notre programme Java afin d'obtenir les performances de mémoire requises:

  • -Xms: la valeur affectée à l' indicateur -Xms définit la valeur initiale et minimale du tas Java. Il peut être utilisé dans les cas où notre application nécessite plus de mémoire que le minimum par défaut lors du démarrage de la JVM
  • -Xmx: De même, nous pouvons définir la valeur maximale de l'espace de tas en l'attribuant à l' indicateur -Xmx . Il peut être utilisé lorsque nous voulons limiter la quantité de mémoire que notre application utilisera, exprès.

Veuillez également noter que la valeur -Xms doit être égale ou inférieure à la valeur -Xmx .

4.1. Usage

java -Xms32M -Xmx64M Main Free Memory : 31792664 bytes Total Memory : 32505856 bytes Max Memory : 59768832 bytes java -Xms64M -Xmx64M Main Free Memory : 63480640 bytes Total Memory : 64487424 bytes Max Memory : 64487424 bytes java -Xms64M -Xmx32M Main Error occurred during initialization of VM Initial heap size set to a larger value than the maximum heap size

5. Conclusion

Dans cet article, nous avons vu comment récupérer des métriques de mémoire JVM via la classe Runtime . Ces méthodes peuvent être utiles lors de l'analyse des fuites de mémoire JVM et d'autres problèmes liés aux performances de la mémoire JVM.

Nous avons également montré comment attribuer des valeurs personnalisées à certains indicateurs conduisant à un comportement de mémoire JVM différent pour différents scénarios.