2012-06-13 8 views
2

Je comparais deux branches d'un de nos projets pour la performance, l'une étant beaucoup plus lente que l'autre. J'ai remarqué que le nombre de GC Run est plus élevé pour un (Voir le graphique ci-dessous).Optimisation du temps de fonctionnement du CPG

Runs

Plus intéressant encore, le temps d'exécution est beaucoup plus élevé, beaucoup plus que ce qui peut expliquer par e les pistes supplémentaires. Qu'est-ce qui expliquerait l'augmentation de 40% (ish) du nombre de passages augmentant le temps de parcours d'un facteur 6? Des objets plus grands? Trop d'objets? Aussi, quels sont les boutons à accorder ici et quel est l'effet? (Quelques bons liens sont très bien comme une réponse)

Time

+1

C'est une chose très compliquée à laquelle il faut répondre dans un forum. Dans tous les cas, vous pouvez commencer par vérifier si vous créez beaucoup plus d'objets qu'auparavant, combien d'entre eux meurent à la première génération et combien se croisent sur le suivant et essayez de déterminer si vous pouvez créer moins d'objets. –

+2

Pas une balle d'argent pour répondre à cette question. Si vous recherchez des informations sur l'optimisation de la collecte des ordures: http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html –

+0

S'agit-il de collecteurs mineurs ou de collections complètes? Que voyez-vous si vous essayez d'augmenter la nouvelle taille? –

Répondre

2

Voici quelques directives de base sur ce que vous pourriez faire pour analyser les performances et le comportement GC des deux branches/versions de votre application:

  1. Évaluer le comportement de GC des deux applications:
    • Recueillir les journaux de GC et de calculer en direct Data Set size, Taux d'attribution, Taux de promotion et Total GC temps. Cela devrait vous permettre de comparer empiriquement le comportement du GC des deux applications.
    • Vous devriez comparer ces statistiques GC entre les applications, voyez-vous des pics/différences entre les deux applications.
    • voir ici howto recueillir ces données: Is there a cookbook guide for GC problems?
  2. Collect Classe Histogrammes
    • si vous confirmerez à l'étape 1 qu'il ya vraiment une grande différence de GC, essayez de collecter Histogrammes de classe pour voir quelles classes occupent le tas. Comparez les histogrammes entre les deux applications et vérifiez s'il existe des différences dans les types de classe et le nombre d'instances. Cela devrait vous aider à identifier le coupable.
    • Avant de recueillir Histogrammes/Après une FullGC: -XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC
    • et aussi, vous collectez des instantanés jmap -histo $pid à tout moment pendant la course. Spécialement si vous voyez des temps de réponse suspects/pics de CPU, etc.
  3. Profil la mémoire avec un outil Java profilage
    • recueillir les profils des deux applications et comparer,
    • Je recommande JProfiler.

directives de base pour la comparaison des performances: Pour comparer efficacement les performances, vous devez être en mesure de générer la même charge de travail pour les deux versions de vos applications, exécutez avec un certain temps de warm-up, puis recueillir les données dans une phase régulière.

Questions connexes