J'ai entendu dire que le JIT inline automatiquement les petites méthodes, comme les getters (ils ont environ 5 octets). Quelle est la limite ? Existe-t-il un indicateur JVM ?
Réponses
Trop de publicités?La politique d'inlining du JIT de HotSpot est plutôt compliquée. Elle implique de nombreuses heuristiques comme la taille de la méthode de l'appelant, la taille de la méthode de l'appelé, le nombre de nœuds IR, la profondeur d'inlining, le nombre d'invocations, le nombre de sites d'appel, le nombre de lancers, les signatures de méthodes, etc.
Certaines limites sont ignorées pour les méthodes accesseurs (getters/setters) et pour les méthodes triviales (nombre de bytecodes inférieur à 6).
Le code source correspondant se trouve principalement dans bytecodeInfo.cpp .
Voir InlineTree::try_to_inline
, should_inline
, should_not_inline
fonctions.
Les principaux indicateurs de la JVM permettant de contrôler l'inlining sont les suivants
-XX:MaxInlineLevel (maximum number of nested calls that are inlined)
-XX:MaxInlineSize (maximum bytecode size of a method to be inlined)
-XX:FreqInlineSize (maximum bytecode size of a frequent method to be inlined)
-XX:MaxTrivialSize (maximum bytecode size of a trivial method to be inlined)
-XX:MinInliningThreshold (min. invocation count a method needs to have to be inlined)
-XX:LiveNodeCountInliningCutoff (max number of live nodes in a method)
https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/codecache.htm#BABGGHJE
MaxInlineSize
Valeur par défaut : 35
Taille maximale du bytecode d'une méthode à inliner
Voir le document Options de la VM Java HotSpot pour JDK 7 et les versions antérieures.