Échapper à l'analyse en Java
Autant que je sache, la JVM utilise échapper à l'analyse de certaines performances optimisations comme de verrouillage de grossissement et de verrouillage de l'élision.
Je suis intéressé si il y a une possibilité pour la JVM de décider que tout objet particulier peut être alloué sur la pile à l'aide échapper à l'analyse.
Certains ressources me faire penser que j'ai raison. Est-il Jvm que faire?
- Documentation Oracle: Après s'être échappée de l'analyse, le serveur compilateur élimine scalaire remplaçable par l'objet des allocations et des verrous associés à partir de code généré. Le serveur compilateur élimine également les verrous pour tous les non-à l'échelle mondiale s'échapper des objets. IL NE REMPLACE PAS UN TAS DE RÉPARTITION AVEC UNE ALLOCATION DE PILE.
- Il ne remplace pas un tas de répartition avec une allocation de pile POUR les NON-à l'échelle MONDIALE s'ÉCHAPPER des OBJETS.
- la question a été posée en 2009 et ma réponse était en 2013 🙂
- laissez le commentaire-être le cas, afin d'éviter la confusion considérant de plus nouvelles versions JDK.
Vous devez vous connecter pour publier un commentaire.
Je ne le pense pas échapper à l'analyse de l'allocation de pile. exemple:
avec
-server -verbose:gc -XX+DoEscapeAnalysis
:Aurait JDK 7 prend en charge l'allocation de pile.
Avec cette version de java -XX:+DoEscapeAnalysis résultats en moins de gc activité et 14x une exécution plus rapide.
Sans échapper à l'analyse,
À échapper à l'analyse,
Le temps d'exécution réduit de manière significative à échapper à l'analyse. Pour ce faire, la boucle a été changé pour 10e9 itérations,
Sans échapper à l'analyse,
À échapper à l'analyse,
De manière à échapper à l'analyse de l'exemple a couru environ 14x plus rapide que les non-escape exécution de l'analyse.
java -XX:+PrintFlagsFinal 2>&1|grep EscapeAnalysis
Échapper à l'analyse est vraiment très jolie, mais elle n'est pas complète obtenir de prison carte gratuite. si vous avez un dynamiquement la taille de la collection à l'intérieur d'un objet, l'évasion d'analyse ne sera PAS basculer du segment de pile. Par exemple:
Même si cet objet est créé dans une méthode et PAS du tout à s'échapper d'une syntaxiques point de vue, le compilateur ne marque pas cela pour s'échapper. Je suspecte parce que longList n'est pas vraiment délimité dans la taille d'un pur point de vue syntaxique, et il pourrait souffler votre pile potentiellement. Donc je crois qu'il faut un laissez-passer sur cette affaire. J'ai testé ce où la longList était vide et encore il a causé des collections dans un simple micro de référence.
longList
est alloué danstoEscape
s constructeur. Le constructeur ne semble pas être intégrées, de sorte que lelongList
de référence s'échappe donc. Le type de l'objet n'a pas d'importance dans ce cas.