2016-06-29 3 views
9

Mon application génère du code Java pendant l'exécution et le compile à l'aide de l'API JavaCompiler. Certains des fichiers générés peuvent être assez volumineux - jusqu'à quelques centaines de milliers de lignes. Je trouve que lorsque j'exécute la commande javac sur le code généré dans la ligne de commande, ou bien si j'utilise une application qui fait juste la compilation via l'API JavaCompiler, je peux compiler plusieurs de ces fichiers (~ 500), même s'ils sont très grands, en moins de deux minutes. Cependant, si j'appelle l'API via mon application lorsqu'elle est en cours d'exécution sur un serveur Tomcat, le temps de compilation est supérieur à douze minutes (!!!).API JavaCompiler - compilation lente lors de l'exécution dans tomcat

J'apprécierais toutes les suggestions sur la façon d'améliorer les performances de la compilation.

Merci!

+0

Je ne peux pas mettre mon doigt sur exactement pourquoi, mais quand je suis passé d'utiliser le compilateur par défaut du système via un appelez 'ToolProvider.getSystemJavaCompiler();' mais utilisez le compilateur JDT d'Eclipse, les choses ont accéléré considérablement. Une explication sera heureusement acceptée comme réponse. – Jewels

+0

une supposition serait eclipse a un compilateur incrémental donc il ne fait pas une construction propre à chaque fois. Cela pourrait être faux si. Il ne répond pas non plus à la question principale –

+0

en regardant jvm avec jvisualvm il semble que javac exécute la compilation entière dans un seul thread, tandis que EclipseCompiler démarre de nombreux threads pour compiler les fichiers '.java'. – Jewels

Répondre

1

Essayez de définir la priorité de fil à la valeur la plus élevée (sur la piscine de fil ou fil):

setPriority(Thread.MAX_PRIORITY);