Encourager la JVM à GC plutôt que de développer le tas?
(À noter que quand je dis "JVM", je veux vraiment dire "Hotspot", et je suis sous la dernière version de Java 1.6 mise à jour.)
Exemple de situation:
Mon JVM en cours d'exécution avec -Xmx fixé à 1 go. Actuellement, le tas a 500 mo d'espace disque alloué, dont 450 mo est utilisée. Le programme doit charger un autre de 200 mo sur le tas. Actuellement, il n'y a 300mo d'une valeur de "collectionner" les ordures dans le tas (on va supposer qu'il en est dans la génération plus âgée.)
En fonctionnement normal, la JVM va pousser le tas de 700 mo, et les ordures de recueillir quand il fait autour d'elle.
Ce que je voudrais dans cette situation est pour la JVM de gc d'abord, puis de répartir les nouveaux trucs, de sorte que nous nous retrouvons avec la taille du tas restant à 500 mo, et le tas à 350 mo.
Est-il un paramètre de JVM combo qui fait que?
source d'informationauteur Electrons_Ahoy
Vous devez vous connecter pour publier un commentaire.
Vous pourriez essayer de préciser
-XX:MinHeapFreeRatio
et-XX:MaxHeapFreeRatio
de contrôle des tas d'expansion et la contraction:-XX:MinHeapFreeRatio
- lorsque le pourcentage d'espace libre dans une génération tombe en dessous de cette valeur, la production sera élargi pour répondre à ce pourcentage. Par défaut est de 40.-XX:MaxHeapFreeRatio
- lorsque le pourcentage d'espace libre dans une génération de dépassement de cette valeur la génération de la réduire à répondre à cette valeur. Par défaut est de 70.Vous pouvez également expérimenter avec les GC en spécifiant
-XX:+UseConcMarkSweepGC
. Selon votre demande, il pourrait garder la taille du segment inférieur au coût supplémentaire de cycles CPU.La JVM est le contraire d'utilisation de la mémoire, vous indiquez que lorsqu'il est optimal à le faire. Vous pouvez spécifier un montant inférieur, comme
-Xmx768m
pour le garder et il peut fonctionner correctement, bien que vous augmenter votre risque de manquer de mémoire dans une lourde charge du scénario. Vraiment la seule façon d'utiliser moins de mémoire globale est d'écrire du code qui utilise moins de mémoire 🙂Il y a quatre (cinq) différents éboueurs de HotSpot, et vos options sont différentes pour chacun.
-XX:MinHeapFreeRatio
et-XX:MaxHeapFreeRatio
qui vous permettent de plus ou moins directement de contrôler le comportement. Je n'ai pas beaucoup d'expérience avec la série collector cependant.-XX:+UseParallelOldGC
) a-XX:MaxGCPauseMillis=<millis>
et-XX:GCTimeRatio=<N>
. Réduction maximale du temps de pause provoque généralement le collecteur de faire des tas de petits. Toutefois, si le temps de pause est déjà de petits tas de ne pas devenir plus petite. Otoh, que, si le max le temps de pause est trop faible, la demande peut passer tout son temps à la collecte. Réduction du gc temps ratio effectue généralement le tas plus petits. Vous d'en parler à la table que vous êtes prêt à consacrer plus de temps CPU pour la collecte en retour pour un petit tas. Cependant, c'est juste une indication et ne peuvent avoir aucun effet. À mon avis, le parallèle collecteur est proche de untunable dans le but de minimiser le tas de la taille. C'est un collectionneur qui fonctionne mieux (il optimise lui-même) si vous le laisser fonctionner pendant un certain temps et le comportement de l'application reste constante.-XX:+UseConcMarkSweepGC
) nécessite généralement un plus grand segment de mémoire pour réaliser son but principal du faible temps de pause, donc je ne vais pas en discuter.-XX:+UseG1GC
) n'est pas aussi mort cérébrale comme la plus ancienne des collectionneurs. Je trouve qu'il choisit une plus petite taille de segment de mémoire sur son propre. Il a beaucoup d'options de paramétrage, bien que j'ai seulement commencé à les étudier.-XX:InitiatingHeapOccupancyPercent
-XX:G1HeapWastePercent
-XX:G1ReservePercent
et-XX:G1MaxNewSizePercent
peuvent être d'intérêt.Prendre un coup d'oeil à la la documentation officielle pour les ramasseurs d'ordures ainsi que cette liste de drapeaux.
Vous pourriez aussi généralement invoquer la
System.gc()
méthode avant de l'allocation supplémentaire de 200 mo d'objets, mais ce sera simplement une allusion à la JVM qu'il peut ou ne peut pas suivre et dans anycase vous ne savez pas quand cela a lieu.. comme indiqué à l'intérieur des documents, il est un best-effort demande.Par la manière de prendre en compte le fait que la collecte des ordures est une opération lourde, donc si il n'y a pas besoin de le faire, il suffit de ne pas essayer de le forcer.
Juste pour savoir: si vous définissez
-Xmx1G
puis vous dites à la JVM de 1 go est le maximum d'espace pour le tas, et puisque vous êtes en précisant que la, je ne vois pas pourquoi elle devrait essayer de maintenir à un niveau faible si elle sait que 1 GO sera toujours ok (nous sommes dans le contexte de la mémoire gérée langues). Si vous ne voulez pas le tas d'augmenter beaucoup juste diminuer la valeur maximale, de sorte qu'il sera forcé de faire la GC avant de l'attribution de nouveaux objets, sinon, pourquoi êtes-vous en train de dire à l'utilisation de 1 go?Je vous recommande de prendre un coup d'oeil ici:
http://www.petefreitag.com/articles/gctuning/