11
votes

Durée de l'excès de GC dans "Java.lang.outofMemorylorororror: limite de dépassement de GC dépassée"

occasionnellement, quelque part entre tous les 2 jours à une fois toutes les deux semaines, mon application se bloque dans un emplacement apparemment aléatoire dans le code avec: java.lang.outofMemororyError: GC limite supérieure dépassée . Si je suis Google cette erreur, je viens à Cette question à la question et qui me conduise à Ce morceau de documentation Sun qui dépense:

Le collecteur parallèle lancera une exférence exceptionnelle si trop de temps est être dépensé dans la collecte des ordures: si plus de 98% du temps total est passé dans la collecte des ordures et moins de 2% du tas est récupéré, un OutofMemoryError sera jeté. Cette fonctionnalité est conçue pour prévenir applications de fonctionnement pendant une période prolongée tout en faisant peu ou pas de progrès parce que le tas est trop petit. Si nécessaire, cela La fonctionnalité peut être désactivée en ajoutant l'option -xx: -usegCoverheadlimit à la ligne de commande.

Qui me dit que ma demande dépendait apparemment de 98% du temps total de la collecte des ordures pour récupérer seulement 2% du tas.

Mais 98% de quelle heure? 98% des deux semaines entière de l'application fonctionnent? 98% des dernières millisecondes?

J'essaie de déterminer une meilleure approche pour résoudre ce problème plutôt que d'utiliser -xx: -usgcoverheadlimit mais je ressens un besoin de mieux comprendre le problème que je résolvez.


4 commentaires

Depuis les documents, il semble être de 98% de la totalité des 2 semaines. Avez-vous activé des journaux GC avec ces indicateurs -Verbose: GC -XX: + printgcDétails xx: + printgCTimeStamps -xloggc: path_from_root / gclog.log. Serait bon de voir l'application d'exécution et d'arrêter de temps en raison de la GC.


La journalisation de GC est une bonne suggestion, je vais essayer ça. 98% de 2 semaines semble improbable mais vous avez raison, c'est ce que signifie les Docs. J'espère que c'est juste une écriture imprécise


Avez-vous découvert la signification de 98% du temps? Mon point de vue est que GC devrait être occupé à prendre 98% de l'utilisation de l'application au moment même où l'exception se produit et non pour les 2 semaines.


@Monis: Je ne l'ai pas trouvé et je suis renoncé à regarder. 98% du temps "au moment même" n'a pas beaucoup de sens, car un moment est par définition, pas une période de temps "98% d'un moment" ne peut pas être (et est tout aussi "long" que 2% d'un instant).


3 Réponses :


1
votes

Les> 98% seraient mesurés au cours de la même période dans laquelle moins de 2% de la mémoire est récupérée.

Il est tout à fait possible qu'il n'y ait pas de période fixe pour cela. Par exemple, si la vérification de l'OIM serait effectuée après chaque chèque de 1 000 000 objets en direct. Le temps qui prend serait dépendant de la machine.

Vous ne pouvez probablement pas "résoudre" votre problème en ajoutant -xx: -usergcoverheadlimit . Le résultat le plus probable est que votre application ralentira à une rampe, utilisez un peu plus de mémoire, puis appuyez sur le point où le GC ne récupère tout simplement pas aucune mémoire . Au lieu de cela, corrigez vos fuites de mémoire, puis (si nécessaire) augmente la taille de votre tas.


0 commentaires

7
votes

J'essaie de déterminer une meilleure approche pour résoudre ce problème plutôt que d'utiliser -xx: -usgcoverheadlimit mais je ressens un besoin de mieux comprendre le problème que je résolvez.

Eh bien, vous utilisez trop de mémoire - et du son de celui-ci, c'est probablement à cause d'une fuite de mémoire lente.

Vous pouvez essayer d'augmenter la taille du tas avec -xmx , ce qui aiderait si ce n'est pas une fuite de mémoire mais un signe que votre application a besoin en réalité beaucoup de tas et le réglage que vous avez actuellement est légèrement à faible. S'il s'agit d'une fuite de mémoire, cela laissera simplement reporter l'inévitable.

Pour enquêter s'il s'agit d'une fuite de mémoire, demandez à la machine virtuelle de vider le tas sur OOM en utilisant le commutateur -XX: + tasdumponOutofMemoryloryError , puis analysez le vidage du tas pour voir s'il y a plus d'objets de une sorte que ce soit qu'il devrait y avoir. http://blogs.oracle.com/alanb/entry/heap_dumps_are_back_with est une jolie bon endroit pour commencer.


EDIT: Comme le sort le ferait, je suis arrivé à ce problème moi-même un jour après que cette question a été posée, dans une application de style lot. Cela n'a pas été causé par une fuite de mémoire et augmenter la taille du tas ne l'aidait pas non plus. Ce que j'ai fait était en fait de diminuer la taille du tas (de 1 Go à 256 Mo) pour rendre GC complet plus rapidement (bien que quelque peu plus fréquent). Ymmv, mais ça vaut la peine d'être coupé.

edit 2: Tous les problèmes résolus par un tas plus petit ... Next Step permettait à la Collecteur de déchets G1 qui semble faire un meilleur travail que CMS.


3 commentaires

J'essaie du profilage et je vais essayer celui-là aussi. Merci.


Je suis allé une itinéraire similaire comme vous l'avez fait, expérimentant des paramètres. Finalement, augmenter la taille du tas et certains peaufinages de mon code (je n'ai trouvé aucune fuite de mémoire) cependant) semble avoir résolu mon problème.


Pourquoi utiliseriez-vous CMS ou G1 dans une application de type lot? Le collection de débits n'est-il pas mieux?



1
votes

Mais 98% de quelle heure? 98% des deux semaines entière de l'application fonctionnent? 98% des dernières millisecondes?

La réponse simple est qu'elle n'est pas spécifiée. Cependant, dans la pratique, la heuristique "travaille", il ne peut donc pas être l'une des deux interprétations extrêmes que vous avez posées.

Si vous vraiment voulait savoir quel intervalle sur lequel sont effectués les mesures, vous pouvez toujours lire le code source OpenJDK 6 ou 7. Mais je ne me dérangerais pas parce que cela ne vous aiderait pas à résoudre votre problème.

La "meilleure" approche consiste à lire sur le réglage (en commençant par les pages Oracle / Sun), puis "tordre les boutons de réglage". Ce n'est pas très scientifique, mais l'espace problématique (avec précision prédire Application + GC Performance) est "Trop dur" étant donné les outils actuellement disponibles.


0 commentaires