web-dev-qa-db-fra.com

UseConcMarkSweepGC vs UseParallelGC

Je rencontre actuellement des problèmes avec des temps de collecte des ordures très longs. veuillez consulter la suite. Ma configuration actuelle est que j'utilise un -Xms1g et -Xmx3g. mon application utilise Java 1.4.2. Je n'ai pas d'indicateurs de récupération de place définis. à première vue, 3 Go ne suffisent pas et j'ai vraiment beaucoup d'objets à récupérer) .

question:

dois-je changer mon algorithme de collecte des ordures? que dois-je utiliser? est-il préférable d'utiliser -XX:+UseParallelGC or -XX:+UseConcMarkSweepGC

ou devrais-je utiliser cette combinaison

-XX:+UseParNewGC -XX:+UseConcMarkSweepGC

ceux qui occupent la mémoire sont en grande partie des données de rapports et non des données de cache. également, la machine a 16 Go de mémoire et je prévois d'augmenter le tas à 8 Go.

Quelle est la différence entre les deux options car j'ai toujours du mal à comprendre. la machine a plusieurs processeurs. Je peux encaisser jusqu'à 5 secondes mais 30 à 70 secondes c'est vraiment dur.

Merci pour l'aide.

  Line 151493: [14/Jan/2012:11:47:48] WARNING ( 8710): CORE3283: stderr: [GC 1632936K->1020739K(2050552K), 1.2462436 secs]
    Line 157710: [14/Jan/2012:11:53:38] WARNING ( 8710): CORE3283: stderr: [GC 1670531K->1058755K(2050552K), 1.1555375 secs]
    Line 163840: [14/Jan/2012:12:00:42] WARNING ( 8710): CORE3283: stderr: [GC 1708547K->1097282K(2050552K), 1.1503118 secs]
    Line 169811: [14/Jan/2012:12:08:02] WARNING ( 8710): CORE3283: stderr: [GC 1747074K->1133764K(2050552K), 1.1017273 secs]
    Line 175879: [14/Jan/2012:12:14:18] WARNING ( 8710): CORE3283: stderr: [GC 1783556K->1173103K(2050552K), 1.2060946 secs]
    Line 176606: [14/Jan/2012:12:15:42] WARNING ( 8710): CORE3283: stderr: [Full GC 1265571K->1124875K(2050552K), 25.0670316 secs]
    Line 184755: [14/Jan/2012:12:25:53] WARNING ( 8710): CORE3283: stderr: [GC 2007435K->1176457K(2784880K), 1.2483770 secs]
    Line 193087: [14/Jan/2012:12:37:09] WARNING ( 8710): CORE3283: stderr: [GC 2059017K->1224285K(2784880K), 1.4739291 secs]
    Line 201377: [14/Jan/2012:12:51:08] WARNING ( 8710): CORE3283: stderr: [Full GC 2106845K->1215242K(2784880K), 30.4016208 secs]


xaa:1: [11/Oct/2011:16:00:28] WARNING (17125): CORE3283: stderr: [Full GC 3114936K->2985477K(3114944K), 53.0468651 secs] --> garbage collection occurring too often as noticed in the time. garbage being collected is quite low and if you would notice is quite close the the heap size. during the 53 seconds, this is equivalent to a pause.
xaa:2087: [11/Oct/2011:16:01:35] WARNING (17125): CORE3283: stderr: [Full GC 3114943K->2991338K(3114944K), 58.3776291 secs]
xaa:3897: [11/Oct/2011:16:02:33] WARNING (17125): CORE3283: stderr: [Full GC 3114940K->2997077K(3114944K), 55.3197974 secs]
xaa:5597: [11/Oct/2011:16:03:00] WARNING (17125): CORE3283: stderr: [Full GC[Unloading class Sun.reflect.GeneratedConstructorAccessor119]
xaa:7936: [11/Oct/2011:16:04:36] WARNING (17125): CORE3283: stderr: [Full GC 3114938K->3004947K(3114944K), 55.5269911 secs]
xaa:9070: [11/Oct/2011:16:05:53] WARNING (17125): CORE3283: stderr: [Full GC 3114937K->3012793K(3114944K), 70.6993328 secs]
27
grassbl8d

Puisque vous avez des pauses GC extrêmement longues, il ne pense pas que changer l'algorithme GC aiderait.

Notez qu'il est très suspect que vous n'ayez que des collections complètes. Vous devrez peut-être augmenter la taille de l'espace réservé aux jeunes générations et/ou aux survivants.

Voir aussi:

7
axtavt

Votre tas est trop petit. La pause est si longue car elle est occupée à parcourir de façon répétée le tas entier à la recherche désespérée de tout ce à collecter.

Vous devez effectuer 1 ou éventuellement plusieurs des opérations suivantes;

  • trouver et corriger une fuite de mémoire
  • régler l'application pour utiliser moins de mémoire
  • configurer la JVM utilise un tas plus grand

Êtes-vous lié à 1.4.2 pour une raison quelconque? Les implémentations de GC ont vraiment évolué depuis lors, vous devriez donc envisager une mise à niveau si possible. Je me rends compte que cela peut être une entreprise non triviale, mais cela vaut la peine d'envisager de toute façon.

4
Matt

Étape 1:

  1. Assurez-vous d'avoir suffisamment de mémoire pour votre application.
  2. Assurez-vous que vous n'avez pas de fuites de mémoire dans votre application. Eclipse Memory Analyzer Tool ou visualvm vous aidera à identifier les fuites dans votre application.

Étape 2:

Si vous n'avez aucun problème avec l'étape 1 en ce qui concerne les fuites de mémoire, reportez-vous à la documentation Oracle page sur les cas d'utilisation de l'algorithme de récupération de place spécifique dans la section "Java Garbage Collectors" et gctuning article.

Puisque vous avez décidé de configurer des tas plus grands (> = 8 Go), G1GC devrait fonctionner correctement pour vous. Reportez-vous à cette question SE relative aux paramètres clés de réglage fin:

Java 7 (JDK 7) garbage collection et documentation sur G1

1
Ravindra babu

Si votre taux de survie est élevé, votre tas peut être trop volumineux. Plus le tas est grand, plus la JVM peut durer sans GC'ing, donc une fois qu'elle frappe, elle a tellement plus à se déplacer.

1
nilskp