2009-11-24 8 views
2

La machine virtuelle JVM et .NET alloue-t-elle des objets sur la pile lorsqu'il est évident pour l'exécution qu'une durée de vie des objets est limitée à une certaine portée?Optimisation de l'allocation JVM et CLR

+1

Pourriez-vous préciser quand il est * évident *? Je ne suis pas sûr à ce sujet ... –

+0

Bien Venant du monde C, C++, il semble assez évident ... Depuis Java et .NET, la VM connaît chaque référence à un objet. Si vous créez un objet dans une méthode et que vous ne le transférez jamais ailleurs, il est logique de le conserver dans la pile. Une pile existe quand même pour passer des arguments, alors pourquoi ne pas bénéficier d'une allocation de pile super rapide (et super simple)? –

Répondre

5

La JVM le fait. Il peut effectivement supprimer l'allocation totalement, dans les bonnes circonstances.

cité ce article.

Le langage Java ne propose aucun moyen d'affecter explicitement un objet sur la pile, mais ce fait ne l'empêche pas de JVMs encore en utilisant l'allocation de la pile, le cas échéant. Les JVM peuvent utiliser une technique appelée analyse d'échappement, par laquelle ils peuvent dire que certains objets restent confinés à un seul thread pendant toute leur durée de vie, et cette durée de vie est limitée par la durée de vie d'une trame de pile donnée. De tels objets peuvent être alloués en toute sécurité sur la pile au lieu du tas. Mieux encore, pour les petits objets, la JVM peut optimiser entièrement l'allocation et simplement hisser les champs de l'objet dans des registres.

Plus d'informations sur Escape analysis de Wikipedia.

+0

Quelle version de la JVM fait cela? Plus important encore, le dernier supporte-t-il l'analyse d'évasion? –

+2

Java 6 mise à jour 14, vous deviez l'activer avec une option de ligne de commande. (-XX: + DoEscapeAnalysis). On dirait qu'il a été supprimé dans la mise à jour 18, puis ajouté à nouveau dans la mise à jour 21. Je ne suis pas sûr si l'option de ligne de commande est toujours requise ou non - mais je l'utiliserais juste être sûr. –