MaxTenuringThreshold-comment ça marche exactement?

j'ai cherché sur Google tous les jours à ce sujet. Mais ce n'est pas encore clair pour moi, donc la question peut sembler un peu délirante.

Bien.. nous savons qu'il y a peu de mémoire principale domaines. Jeune, Titulaire (Ancienne génération) et PermGen.

Young domain est divisé en Eden et Survivor (dont deux). OldGen est pour les objets survivants.

En ce qui concerne MaxTenuringThreshold - il empêche les objets d'être finalement copiés à L'Espace OldGen trop début.

Il est assez clair et compréhensible.

Mais que "MaxTenuringThreshold"... - comment il est exactement œuvres?

Comment le éboueur traite-t-il ces objets qui survivent encore jusqu'à ce que MaxTenuringThreshold et de quelle manière ? Où sont-ils situés ?

les objets sont recopiés dans les espaces réservés aux survivants pour la collecte des ordures.. ou il se passe quelque chose?

Je N'ai trouvé aucune bonne explication à cela, donc je serai beaucoup appréciez les liens ou explications utiles.

27
demandé sur Clark Bao 2012-11-24 21:07:53

2 réponses

chaque objet dans Java heap a un en-tête qui est utilisé par L'algorithme de collecte des ordures (GC). Le jeune collecteur spatial(qui est responsable de la promotion des objets) utilise quelques bits de cet en-tête pour suivre le nombre d'objets de collections qui ont survécu (JVM 32 bits utilise 4 bits pour cela, 64 bits probablement un peu plus).

au cours de la collection young space, chaque objet est copié. L'objet peut être copié dans un des espaces de survie (un qui est vide avant les jeunes GC) ou à l'ancien de l'espace. Pour chaque objet copié, l'algorithme de GC augmente son âge (Nombre de collections préservées) et si l'âge est au-dessus du courant seuil de tension il serait copié (promu) dans l'ancien espace. L'objet peut aussi être copié directement dans l'ancien espace si l'espace de survie se remplit (débordement).

le parcours de L'objet a le motif suivant:

  • alloués dans eden
  • copié depuis eden vers l'espace de survie young GC
  • copié de survival à (autre) survival space en raison de la jeune GC (cela pourrait se produire quelques fois)
  • promu de survival (ou possible eden) à old space en raison de jeunes GC (ou FULL GC)

la réelle seuil de tension est réglé dynamiquement par JVM, mais MaxTenuringThreshold fixe une limite supérieure.

si vous définissez MaxTenuringThreshold=0, tous les objets seront promus immédiatement.

j'ai quelques articles à propos de java garbage collection, vous y trouverez plus de détails.

52
répondu Alexey Ragozin 2016-08-08 13:55:01

(Avertissement: Ce couvre HotSpot VM)

comme le dit Alexey, le seuil de tension effectivement utilisé est déterminé dynamiquement par la JVM. Il y a très peu de valeur dans le paramètre. Pour la plupart des applications, la valeur par défaut de 15 sera assez élevé, comme d'habitude beaucoup plus d'objet survivent à la collection. Lorsque de nombreux objets survivent à la collection, les espaces des survivants débordent directement sur les anciens. C'est ce qu'on appelle une promotion prématurée et un indicateur de problème. Cependant, il ne peuvent que rarement être résolu en réglant MaxTenuringThreshold.

dans ces cas, parfois SurvivorRatio peut être utilisé pour augmenter l'espace dans les espaces de survivant, ce qui permet à la tenure de fonctionner réellement. Toutefois, l'élargissement de la jeune génération est le plus souvent le seul bon choix (du point de vue de la configuration). Si vous regardez du point de vue du codage, vous devriez éviter l'attribution excessive d'objet pour laisser la tenure fonctionne comme prévu.

Pour répondre exactement ce que vous avez demandé: Lorsqu'un objet atteint son seuil de tenure déterminé JVM, il est copié à l'ancienne. Avant cela, il sera copié dans l'espace vide de survivor. Les objets qui ont survécu un certain temps, mais qui ont été dé-référencés avant d'atteindre le seuil, sont nettoyés de survivor très efficacement.

12
répondu Fabian Lange 2012-11-25 20:43:54