Allocations dans les nouveaux TLAB vs allocations hors TLAB

L’outil Java Mission Control du JDK fournit des statistiques sur l’allocation des objects dans les nouveaux TLAB et les allocations en dehors de TLAB. (C’est sous Mémoire / Allocations). Quelle est la signification de ces statistiques, qu’est-ce qui est bon pour la performance d’une application? Dois-je m’inquiéter si des objects sont alloués en dehors de TLAB et si oui, que puis-je faire à ce sujet?

Un TLAB est un tampon d’allocation locale de thread. La manière normale dont les objects sont alloués dans HotSpot se trouve dans un TLAB. Les allocations de TLAB peuvent être effectuées sans synchronisation avec les autres threads, car le tampon d’allocation est un thread local, la synchronisation n’est nécessaire que lorsqu’un nouveau TLAB est extrait.

Le scénario idéal est donc que le plus grand nombre possible d’allocations soit effectué dans des TLAB.

Certains objects seront alloués en dehors des TLAB, par exemple des objects volumineux. Il n’y a rien à craindre tant que le pourcentage d’allocations hors TLAB par rapport aux allocations dans les nouveaux TLAB est faible.

Les TLAB sont redimensionnés dynamicment pendant l’exécution de chaque thread individuellement. Ainsi, si un thread alloue beaucoup, la taille des nouveaux TLAB obtenus à partir du tas augmentera. Si vous le souhaitez, vous pouvez essayer de définir l’ -XX:MinTLABSize pour définir la taille minimale de TLAB, par exemple -XX:MinTLABSize=4k

Réponse fournie par mon collègue David Lindholm 🙂