Après avoir apporté quelques modifications à une application, elle a subi une dégradation significative des performances et, en cours d'analyse, l'une des méthodes les plus fréquemment appelées n'est plus compilée. En cours d'exécution: -XX:+LogCompilation
montre qu'avant la modification, cette méthode était: mise en file d'attente pour la compilation, compilée, puis insérée avec succès dans les appelants; alors après le changement, il n'y a aucune trace d'une tentative de compilation et la tentative de inline dit:Qu'est-ce qui cause qu'une méthode soit classée comme "non compilable (désactivée)" par le compilateur de hotspot?
raison inline_fail = « non compilable (désactivé) »
La méthode originale est la suivante, où _maxRepeats
est une variable d'instance déclarée comme Map
(aucun générique, code écrit il y a longtemps), utilisée telle que la clé était un objet de la classe DadNode
et la valeur était Integer
.
private int cnsGetMaxRepeats(DadNode dn) {
if (_maxRepeats != null) {
Integer max = (Integer)_maxRepeats.get(dn);
if (max != null) {
return max;
}
}
return dn.getMaxOccurs().getValue();
}
L'amendement consistait à remplacer la carte _maxRepeats
utiliser les médicaments génériques:
Map<Integer, Integer>
et un nouveau paramètre a été ajouté à la méthode:
private int cnsGetMaxRepeats(int childIdx, DadNode dn) {
if (_maxRepeats != null) {
Integer max = _maxRepeats.get(childIdx);
if (max != null) {
return max;
}
}
return dn.getMaxOccurs().getValue();
}
En utilisant des appels explicites à Integer.valueOf
et Integer.intValue
à éviter l'autoboxing ne fait aucune différence; la méthode n'est toujours pas compilable.
Je peux "pousser avec un bâton" jusqu'à ce que j'obtienne une solution qui fait ce que je veux (et qui est aussi compilable), mais quels sont les critères derrière cette désactivation?
Il peut être marqué comme non-conforme pour des raisons sans rapport avec le code lui-même. Par exemple, avez-vous essayé d'augmenter la taille du cache de code? '-XX: ReservedCodeCacheSize' – Gene
Quelle version de Java utilisez-vous? Est-ce que le système d'exploitation 32 bits ou 64 bits? Utilisez-vous le compilateur client ou le compilateur serveur? –
quelle version utilisez-vous? 'LogCompilation' est' PrintCompilation' depuis longtemps ... – Eugene