2017-08-31 2 views
0

J'ai besoin d'une règle approximative concernant la durée maximale de la collecte complète des déchets. La motivation est d'être capable de distinguer entre un processus JVM défectueux et un processus qui est sous GC. Supposons que je dispose d'un matériel de serveur à usage général normal, HotSpot JVM 8, la taille de segment est 20G-40G, aucune option de mémoire GC et de mémoire spécifique n'est définie. Qu'est-ce qu'un délai raisonnable pour le GC pour compléter? Est-ce 5 minutes, 20 minutes ou jusqu'à des heures?Quelle est la durée approximative du ramassage des ordures dans le cas le plus défavorable sur les grands tas?

Mise à jour: Mon application est un travail déconnecté nécessitant beaucoup de mémoire traitant des structures de données volumineuses. Je n'ai pas besoin d'accorder GC du tout. Les pauses de 10 secondes et 10 minutes sont très bien si cette limite est connue.

+0

5 ou 20 minutes? Est-ce que cela vous semble raisonnable que votre programme s'arrête pendant si longtemps? – alfasin

+2

Je serais vraiment surpris si vous avez vraiment besoin de penser "minutes" ici. Je * espère * pour quelques * secondes * au maximum. Et au-delà: cela dépend toujours des caractéristiques de votre application. – GhostCat

+0

Je me souviens courir dans un exemple de 18 secondes GC qui a été considéré comme * vraiment mauvais * ... – alfasin

Répondre

2

Il est très difficile de quantifier combien de temps GC « devrait » prendre parce que cela dépend de plusieurs facteurs:

  • Quelle est la taille du tas est.
  • Comment complète le tas est; c'est-à-dire le rapport des ordures aux non-ordures lorsque vous exécutez le GC.
  • Combien de pointeurs/références doivent parcourir.
  • Quel GC vous utilisez.
  • Qu'il s'agisse d'une collection «nouvelle génération» mineure, d'une «collection ancienne génération» majeure ou d'une collection «complète». Le dernier est généralement effectué par le collecteur de secours lorsqu'un collecteur à faible latence ne peut pas suivre le rythme de la génération des déchets.
  • S'il existe un < physique -> un écrasement de la mémoire virtuelle se produit.

Il y a deux situations pathologiques qui peuvent entraîner des temps excessifs GC:

  • Si le tas est presque plein, le GC utilise une proportion croissante de temps à essayer de récupérer le dernier bit de libre espace.

  • Si vous avez un segment de mémoire supérieur à la mémoire physique disponible, vous pouvez entrer dans le comportement de "saturation" de la mémoire virtuelle. Ceci est le plus prononcé au cours d'un GC majeur ou complet.


Si vous devez choisir un numéro, je vous suggère d'utiliser celui qui « se sent » droit à vous, et en faire un paramètre de configuration de sorte qu'il est facile à modifier.En outre, activez la journalisation GC et examinez les fois par heure qui sont signalés ici. (En particulier lorsque la charge du serveur est élevée.)

0

Premièrement, le temps de pause gc compte sur millisecondes dans la plupart du temps. Si un gc prend plus d'un deuxième, je pense que votre application doit être réglée de toute façon.

Et puis comme le commentaire a dit, le temps de pause gc dépend des caractéristiques de votre application. Donc, si vous voulez une règle de base concernant la durée maximale de la collecte des ordures complète pour votre application, je vous conseille de recueillir les gc.log et faire des statistiques sur elle, alors vous saurez combien de temps est le temps de pause dans un peu gc.

0

Pour les travaux batch où la latence n'a pas beaucoup d'importance qu'il ya de meilleures mesures que les temps de pause:

a) MB de déchets collectés/temps/core cpu

Les faibles taux de collecte indiquent généralement des cas pathologiques tels que l'échange, la consolidation d'une page énorme et transparente ou certains cas limites dans le CPG, tels que les réseaux de référence gigantesques analysés.

b) débit d'application - le rapport entre le temps passé dans le mur et le code de l'application par rapport au temps passé dans le CPG.

Les longs GC ne sont pas un gros problème s'ils se produisent rarement.

Les deux peuvent être obtenus en exécutant les journaux GC par GCViewer

0

Ma recommandation est: 1.Configurer sur le paramètre JVM et activer les journaux de GC, consultez les journaux de GC, vous verrez combien de temps le GC prend 2 GC ne sera pas minutes, j'ai vu environ 13 secondes de pause que le client a été très gravement touché.