Maison > Java > javaDidacticiel > Les expressions Java Lambda provoquent-elles des problèmes importants d'allocation de tas et de performances ?

Les expressions Java Lambda provoquent-elles des problèmes importants d'allocation de tas et de performances ?

Linda Hamilton
Libérer: 2024-12-27 06:00:24
original
291 Les gens l'ont consulté

Do Java Lambda Expressions Cause Significant Heap Allocation and Performance Problems?

Expressions lambda : allocation de tas et implications en termes de performances

Dans Java 8, les expressions lambda fournissent une syntaxe succincte et fonctionnelle pour l'écriture de code. Cependant, des inquiétudes ont été soulevées quant à savoir si les expressions lambda créent de nouveaux objets sur le tas à chaque fois qu'elles sont exécutées, en particulier lors de l'itération sur des collections.

Expressions lambda et création d'objets

La syntaxe équivalente pour les expressions lambda utilisant l'approche traditionnelle des classes anonymes est :

myStream.forEach(new Consumer<Item>() {
  @Override
  public void accept(Item item) {
    // do something useful
  }
});
Copier après la connexion

Dans les deux cas, une expression lambda ou une classe anonyme instance est créée pour représenter l’action effectuée sur chaque élément de la collection. Cependant, la principale différence réside dans la manière dont ils sont implémentés.

Comportement spécifié par la spécification du langage Java

La spécification du langage Java indique qu'une expression lambda n'a pas toujours besoin de créer un nouvel objet pour chaque évaluation. La JVM est flexible dans la façon dont elle gère les expressions lambda, y compris la réutilisation des objets et l'optimisation basée sur les variables capturées.

Plus précisément, la spécification autorise les scénarios suivants :

  • La même instance peut être réutilisé pour plusieurs expressions lambda avec des corps identiques.
  • Différentes expressions lambda ne doivent pas nécessairement appartenir à des classes.
  • Chaque objet d'évaluation lambda n'appartient pas nécessairement à la même classe.
  • L'"instance existante" utilisée aurait pu être créée lors de l'initialisation de la classe englobante plutôt que lors d'une évaluation lambda précédente.

JVM Oracle actuelle Implémentation

Actuellement, la JVM d'Oracle adopte une approche conservatrice, créant une instance par expression lambda. Cependant, les singletons sont utilisés pour les expressions lambda qui ne capturent pas de valeurs. Cela signifie que dans la plupart des cas, aucun nouvel objet n'est alloué sur le tas lors de l'itération sur des collections à l'aide d'expressions lambda.

Implications sur les performances

L'espace du tas alloué aux objets lambda est négligeable, surtout pour les petites collections. Les implications en termes de performances sont principalement liées à la surcharge liée à la création de nouveaux objets dans le cas d'expressions lambda non singleton, qui est souvent insignifiante.

Conclusion

Alors que les expressions lambda fournissent un moyen pratique et expressif d'écrire du code, ils n'entraînent généralement pas de problèmes importants d'allocation de tas ou de performances, en particulier lorsque des compilateurs d'optimisation sont utilisés. Les développeurs peuvent généralement utiliser des expressions lambda sans se soucier de la création excessive d'objets ou de la consommation de tas.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal