2010-07-09 4 views
1

Est-il concevable que la vitesse à laquelle les nouveaux objets sont créés par un programme Java dépasse quelque peu la vitesse à laquelle ces objets sont collectés dans la jeune génération?Taux de récupération de place par rapport au taux d'allocation d'objet

... De ce fait, un retard de plus en plus grand de nouveaux objets se trouve-t-il sur le tas jusqu'à ce qu'un gc complet soit déclenché?

Toutes les mesures que je pourrais recueillir pour identifier/vérifier ce scénario?

Les objets créés ont une durée de vie maximale d'environ 1 seconde. La plupart sont en vie pendant environ 400 millisecondes, en moyenne.

Merci.

Répondre

3

Lorsque le CPG entre et sort des objets de Young (à S0 ou S1), les objets morts ne sont pas copiés et donc jetés. Les objets sont déplacés un certain nombre de fois entre S0 et S1 jusqu'à ce qu'ils meurent ou qu'ils deviennent assez vieux pour être transférés dans l'Ancien. S0 et S1 est l'espace de stockage entre les espaces Young (Eden) et Old.

Le GC fonctionne si longtemps qu'il y a des objets à copier, jetant tous ceux qui sont morts. Le GC complet est exécuté lorsque la mémoire a réellement besoin d'être récupérée, les exemples d'objets doivent être supprimés de l'ancien espace. Le moyen le plus rapide de nettoyer l'espace des jeunes est d'attendre que la plupart des objets soient morts, car vous n'avez pas besoin de copier autant d'objets vers S0 | S1 et plus tard vers Vieux.

Remplir la mémoire, puis prendre la pénalité d'un cycle GC plus long est en fait plus efficace que de laisser le GC s'exécuter avec des intervalles très courts. C'est pourquoi vous voyez votre mémoire grandir et grandir jusqu'à ce qu'elle soit presque pleine, et puis tout retombe à presque rien à nouveau.

Un GC complet est StopTheWorld c'est nécessaire pour réorganiser les objets sur le tas dans l'ancien espace, il n'est pas nécessaire dans l'espace jeune. Si l'espace jeune devient plein, les objets rapides peuvent être promus à l'Ancien. Ce n'est pas un bon cas et c'est le cas auquel vous songez.

Pour éviter les GC complets, vous pouvez calculer la quantité de mémoire dont vous aurez besoin dans Young Space avec le taux de création dont vous disposez pour vous assurer que les objets ne sont pas promus avant d'être nécessaires.Il est également possible de régler la taille de l'espace S0 et S1 et le nombre de fois où les objets rebondiront entre eux avant qu'ils ne se retrouvent dans l'espace ancien (nécessitant un GC complet à supprimer).

Un bon lien, mais un peu vieux est celui-ci sur Tuning Garbage Collection

1

Il est concevable ...

Je ne pense pas que la série HotSpot, collecteurs parallèle ou CMS se comporter de cette façon. Vous pouvez lire tout à leur sujet here, here et here (pour le collecteur G1).

Il existe une situation dans laquelle les objets sont promus sans un cycle GC jeune génération. C'est alors que le collecteur détermine que l'ancien espace est trop plein pour contenir d'autres objets promus. Ensuite, le collectionneur en série ou en parallèle effectuera une collection complète des générations jeunes et anciennes.

Toutes les mesures que je pourrais recueillir pour identifier/vérifier ce scénario?

Les journaux GC pourraient révéler cela. Je ne sais pas.