2010-03-17 2 views
2

Je suis en train d'optimiser le temps de chargement du temps de démarrage/classe de mon application Java Web parce que son sur le Google App Engine et le temps de démarrage est important.Est-il possible d'allumer une sorte de journalisation machine virtuelle Java afin que je puisse voir ce qui se passe au cours classloading etc

Est-il possible que je peux allumer une sorte de messages de débogage de chargement de classe ou someway pour voir où le temps est passé pendant le chargement de la classe? Je veux voir si des bibliothèques spécifiques mettent du temps à se charger et se débarrasser d'elles si elles ne sont pas essentielles.

Répondre

6

Si vous voulez voir ce que les classes ont été chargées et dans quel ordre vous pouvez exécuter avec le drapeau -verbose.

Exemple:

java -verbose:class <MyProgram> 

Sortie:

[Loaded java.lang.Object from shared objects file] 
[Loaded java.io.Serializable from shared objects file] 
[Loaded java.lang.Comparable from shared objects file] 
[Loaded java.lang.CharSequence from shared objects file] 
[Loaded java.lang.String from shared objects file] 
[Loaded java.lang.reflect.GenericDeclaration from shared objects file] 
[Loaded java.lang.reflect.Type from shared objects file] 
[Loaded java.lang.reflect.AnnotatedElement from shared objects file] 
[Loaded java.lang.Class from shared objects file] 
[Loaded java.lang.Cloneable from shared objects file] 
[Loaded java.lang.ClassLoader from shared objects file] 
[Loaded java.lang.System from shared objects file] 
[Loaded java.lang.Throwable from shared objects file] 
[Loaded java.lang.Error from shared objects file] 
.. 
.. 
.. 
+0

Malheureusement, cela ne fonctionnera pas dans l'environnement App Engine où Épines tente de déboguer ce problème. –

+0

Je ne comprends pas, pourquoi pas? –

+0

Parce qu'il est déployé sur App Engine. Vous n'avez aucun contrôle sur jvm dans App Engine. Une fois que vous avez téléchargé votre projet, il est exécuté par le moteur d'exécution de l'application. vous ne commencez pas le JVM vous-même. –

0

Ajout d'une bibliothèque à l'classpath ne causera pas à se charger d'ailleurs, aucune classe en un. Les classes sont généralement chargées au besoin (peut-être la JVM préchargera-t-elle des classes communes, mais c'est généralement aussi loin que cela se passe). Le seul réel besoin de réduire le nombre de classes/librarie est donc la réduction de la maintenance (même si ce n'est pas utilisé, il faudra suivre les versions, etc.) et éventuellement les temps de téléchargement et la taille du déploiement.

Ceux-ci peuvent être des facteurs importants bien sûr, mais généralement n'affectera pas les performances d'exécution. Le principal avantage de la journalisation de la classe est de détecter si une version incorrecte d'une classe est en cours de chargement et d'où si vous rencontrez des problèmes étranges. Par exemple, vous attendez qu'une classe soit chargée à partir d'une bibliothèque que vous avez explicitement incluse, mais chargée à partir d'un répertoire lib/ext où elle a été placée par une application tierce peu scrupuleuse (Adobe a tendance à y mettre , peut-être aussi d'autres, mais cela peut également arriver avec des applications qui s'exécutent dans des serveurs d'applications et qui obtiennent des classes communes du serveur d'applications à des moments qui peuvent entrer en conflit avec différentes versions de ces mêmes classes distribuées avec l'application).

Questions connexes