2017-06-12 1 views
0

enter image description here (et les lignes Max Committed sont même)même il y a beaucoup de mémoire inutilisée gauche

Je

cherche à l'utilisation de la mémoire pour une application Java dans newrelic. Voici plusieurs questions:

# 1

Les committed PS Survivor Space Heap variés dans ces derniers jours. Mais devrait-il être constant puisqu'il est configuré par JVM? D'après ce que je comprends

# 2

, la mémoire du tas devrait diminuer quand il y a une collecte des ordures. La mémoire de Eden peut diminuer lorsqu'un gc majeur ou un gc mineur survient, tandis que la mémoire de Old peut diminuer lorsqu'un gc majeur se produit.

Mais si vous regardez Old l'utilisation de la mémoire, un certain temps entre le 6 et le 7 juin, la mémoire a augmenté, puis plus tard, elle est descendue. Cela devrait représenter un gc majeur, non? Cependant, il restait encore beaucoup de mémoire inutilisée. Il n'a pas semblé presque atteindre la limite. Alors, comment le GC majeur a-t-il été déclenché? Idem pour Eden l'utilisation de la mémoire, il n'a jamais atteint la limite, mais il a diminué.

L'application extrait un fichier à partir d'autres emplacements. Ce fichier peut être volumineux et être traité en mémoire. Cela pourrait-il expliquer le problème ci-dessus?

+0

Quels sont les arguments JVM utilisés? – Fairoz

Répondre

1

Vous devez fournir plus d'informations sur votre configuration pour y répondre de manière définitive. Je suppose que vous utilisez la JVM Hotspot d'Oracle et que vous utilisez le collecteur G1. La publication des drapeaux avec lesquels vous démarrez la JVM serait également utile.

  1. Le terme clé ici est «validé». C'est de la mémoire réservée par la JVM, mais pas nécessairement utilisée (ou même mappée sur des pages physiques, c'est juste une plage de mémoire virtuelle qui peut être utilisée par la JVM). Il y a une bonne description de ceci dans la classe MemoryUsage du paquetage java.lang.management (vérifiez les docs de l'API). Il indique que «commit représente la quantité de mémoire (en octets) dont la machine virtuelle Java peut garantir l'utilisation.» La quantité de mémoire validée peut changer avec le temps (augmenter ou diminuer) .La machine virtuelle Java peut libérer de la mémoire. au système ... "C'est pourquoi vous le voyez changer.

  2. En supposant que vous utilisez G1, le collecteur effectue un compactage incrémentiel. Vous avez raison de dire que si le collecteur ne pouvait pas suivre la répartition dans l'ancienne génération et que l'espace devenait insuffisant, il effectuerait une collection complète de compactage. Cela ne se produit pas ici car le dernier graphique montre que vous n'utilisez nulle part l'espace de tas alloué. Cependant, pour éviter cela, G1 collectera et compactera simultanément avec votre application. C'est pourquoi vous voyez l'utilisation augmenter (lorsque votre application instancie plus d'objets) et ensuite diminuer (le collecteur G1 récupère l'espace des objets qui ne sont plus nécessaires). Pour une explication plus détaillée du fonctionnement de G1, il y a une bonne lecture dans la documentation, https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html.