web-dev-qa-db-fra.com

Qu'est-ce qu'un TLAB (Thread Local Allocation Buffer)?

Je n'ai pas pu trouver une source complète qui expliquerait le concept de manière claire. Ma compréhension est qu'un thread reçoit un morceau de mémoire dans l'éden où il alloue de nouveaux objets. Un thread concurrent finira par avoir un morceau d'éden quelque peu consécutif. Que se passe-t-il si le premier thread manque de zone libre dans son TLAB? Aurait-il besoin d'un nouveau morceau d'éden?

27
user1745356

L'idée d'un TLAB est de réduire le besoin de synchronisation entre les threads. À l'aide de TLAB, ce besoin est réduit car tout thread a une zone qu'il peut utiliser et s'attend à ce qu'il soit le seul thread à utiliser cette zone. En supposant qu'un TLAB peut contenir 100 objets, un thread aurait seulement besoin d'acquérir un verrou pour réclamer plus de mémoire lors de l'allocation de l'objet 101. Sans TLAB, cela serait requis pour chaque objet. L'inconvénient est bien sûr que vous perdez potentiellement de l'espace.

Les gros objets sont généralement alloués en dehors d'un TLAB car ils annulent l'avantage de réduire la fréquence d'allocation de mémoire synchronisée. Certains objets peuvent même ne pas tenir à l'intérieur d'un TLAB.

Vous pouvez définir la taille d'un TLAB à l'aide de -XX:TLABSize flag mais en général je ne vous recommande pas de jouer avec ces paramètres sauf si vous avez vraiment découvert un problème que vous pouvez résoudre par là.

34