Pourquoi la définition de la classe comme final améliore les performances de la JVM?
Citant http://sites.google.com/site/gson/gson-design-document:
Pourquoi sont la plupart des classes dans Gson marqué comme
final?Tout Gson fournit un assez
architecture extensible en fournissant
enfichable sérialiseurs et
deserializers, Gson classes n'étaient pas
spécialement conçu pour être
extensible. Non-final
les classes aurait permis à un utilisateur de
légitimement étendre Gson classes, et
alors s'attendre à ce que le comportement de travailler dans
toutes les modifications ultérieures. Nous avons choisi de
de limiter de tels cas d'utilisation par le marquage
les classes final, et attendre jusqu'à ce qu'un
bon de cas d'utilisation de ressort pour permettre
l'extensibilité. Marquage d'une classe finale
a également un léger avantage de fournir
supplémentaire possibilités d'optimisation
pour Java compilateur et de la machine virtuelle.
Pourquoi est-ce le cas? [Si je suppose: de la JVM sait classe est définitive, il ne maintient pas la méthode remplacer les tables? Existe-il d'autres raisons?]
Quel est l'avantage de la performance?
N'cela s'applique à des catégories que sont la fréquence instancié (POJO?) ou peut-être à la classe qui sont les détenteurs des méthodes statiques (classes utilitaires) ?
Sont des méthodes définies comme final peut aussi théoriquement d'améliorer les performances?
Existe-il des conséquences?
Merci,
Maxim.
- Je suis sûr que si vous avez effectué une recherche vous permettra de trouver une réponse à cela; je me souviens d'une juste il y a quelques jours. Mais peu importe, je vous recommande d'ignorer que la dernière phrase; le reste du paragraphe est ce qui est important.
- Je demande pour l'apprentissage à des fins. Aimerais un lien parce que je n'ai pas trouvé (N'a couru une recherche rapide avant de demander).
- D'accord, les avantages du marquage des classes
final
a plus à voir avec la documentation relative à leur conception (ou l'absence) de l'extensibilité de la performance. (D'un autre côté, ce n'est pas ce que @Maxime Veksler demandé...) - Je sais pas relativement sain d'esprit JVM qui saute CHA (hiérarchie de classes d'analyse), alors au final les classes d'améliorer rien.
- Ce que je comprends, c'est l'équipe qui permet une optimisation sur
final
pas la JVM. Voir cet article pour plus de détails.
Vous devez vous connecter pour publier un commentaire.
Virtuel (remplacée) méthodes sont généralement mis en œuvre par le biais de certains de tri de tableau (vtable) qui est en fin de compte un pointeur de fonction. Chaque appel de méthode a la surcharge d'avoir à passer par ce pointeur. Lorsque les classes sont marqués en définitive, toutes les méthodes ne peuvent pas être remplacées et l'utilisation d'un tableau n'est plus nécessaire - ce qu'il est plus rapide.
Certaines VMs (comme HotSpot) peut faire les choses plus intelligemment et de savoir si les méthodes sont/ne sont pas écrasés et de générer plus rapidement le code approprié.
Ici est certaines informations plus spécifiques sur le HotSpot. Et certains général info trop.
Un vieux, apparemment plus
mais encore largementéchéant, de l'article sur ce à partir d'IBM developerWorks, qui stipule:Aussi voir ce liés à la réponse à une autre question. Il y a aussi le équivalent en question .Net, discuté ici. DONC, la discussion, "Sont finales méthodes inline?" Sur une question intitulée "Quelles optimisations vont être inutile demain", celui-ci apparaît sur la liste.
Ici est quelqu'un qui essaie de caractériser l'effet sur HotSpot inline de la statique et de la finale de classes.
Note également qu'il ya un impliquant de les effets de la
final
classes vsfinal
méthodes. Vous peut obtenir quelque avantage de performance (encore une fois, je n'ai pas une bonne référence) pourfinal
méthodes pour assurer, comme il pourrait de repère de l'équipe à faire de l'in-lining, il ne pouvait pas faire autrement (ou pas si simple). Vous obtenez le même effet lorsque vous marquez la classefinal
, ce qui signifie que toutes les méthodes sont soudainement finale ainsi. Notez que le Sun/Oracle de gens prétendent que le HotSpot pouvez généralement le faire avec ou sans lefinal
mot-clé. Il n'existe aucun supplémentaires effets d'avoir la classe elle-mêmefinal
?De référence, des liens vers la JLS sur finale méthodes et final classes.
De ne pas savoir la mise en œuvre de chaque particulier JVM, je serait théoriquement dire que si une JVM sait qu'un pointeur vers un objet est un pointeur vers un type qui est définitive, elle peut le faire non virtuelle des appels de fonction (c'est à dire, directe vs indirecte) à un membre de fonctions (c'est à dire, pas d'indirection par l'intermédiaire d'un pointeur de fonction), ce qui peut entraîner une exécution plus rapide. Cela peut également conduire à inlinining possibilités.
Marquage des classes finale permet à d'autres optimisations pour être appliqué pendant le JIT scène.
Si vous appelez une méthode virtuelle sur un non-classe final, vous ne savez pas si la bonne mise en œuvre est celle qui est définie dans la classe, ou de certains sous-classe que vous ne connaissez pas.
Toutefois, si vous avez une référence à une classe final, vous le savez la mise en œuvre spécifique qui est requise.
Considérer:
Dans ce cas, l'équipe ne peut pas savoir si C est de la mise en œuvre de toString() ou B de la mise en œuvre de toString() sera appelée. Toutefois, si B est marqué comme final, il est impossible pour toute application autre que B est à la bonne mise en œuvre
Pas de différence, c'est que de la spéculation. La seule situation où il n'a de sens sont des classes comme String, etc, où la jvm de les traiter différemment.