2017-06-29 5 views
10

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?

+0

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

+0

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? –

+0

quelle version utilisez-vous? 'LogCompilation' est' PrintCompilation' depuis longtemps ... – Eugene

Répondre

2

Je pense une erreur de base de ma part - le journal avec la méthode "compilation désactivée" a été produit lors de l'exécution du débogage à travers IntelliJ (bien que avec des points d'interruption en sourdine). Je m'attends à ce que IntelliJ désactive les compilations pour les méthodes avec des points d'arrêt, même en mode silencieux. Donc, pour répondre à ma propre question, je n'ai aucune raison de penser que quelque chose d'autre que la désactivation explicite de la compilation le fera.