Pourquoi Java code de ralentir dans le débogueur?
Certains CPU intensive des routines d'obtenir bien plus de temps lorsqu'il est exécuté par un débogueur. Pourquoi est-ce?
Actuellement, je suis juste à l'aide de l'Ide, à l'étape par le biais de code qui s'exécute dans JBoss. Quand j'ai démarrer JBoss, j'utilise ces options:
set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MaxPermSize=256m -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n %JAVA_OPTS%
Est-il un moyen d'accélérer l'exécution? Ou pour accélérer certaines méthodes d'exécutions que je n'ai pas besoin pour l'étape?
Mise à jour: Semble si je ne suis pas d'étape sur/dans la CPU intensive routines (ie: il suffit d'exécuter jusqu'à un point d'arrêt défini juste après la routine), alors le temps d'exécution est comme si pas dans un débogueur.
Vous devez vous connecter pour publier un commentaire.
Parce que la Gigue de ne pas optimiser le code comme beaucoup (souvent, pas du tout) lorsque le débogage est activé.
Il dépend également de la "points d'arrêt" de style. E. g. avoir les points d'observation sur les variables ou de mettre des points d'arrêt sur niveau d'interface (débogueur s'arrêter sur l'ensemble de la méthode des implémentations lorsqu'elles sont exécutées) souvent ralentit considérablement le temps de traitement.
Lors du débogage, en plus de l'exécution de votre application, vous êtes également en cours d'exécution d'un débogueur.
Le code est compilé en mode debug avec les métadonnées de symboles sur les variables locales et les autres au niveau de la source de l'information. Le débogueur de lit à savoir quelle ligne de code source correspond à l'instruction en cours. Le processus est appelé symboliques de débogage. La stockées symboles augmentation de la taille du code et de l'interprétation augmente le temps d'exécution.
Certains débogueurs fait d'interpréter le code à la volée, ce qui est presque toujours un important gain de performance.
Plus d'informations au sujet de Java debug mode de compilation, qui est effectuée par
javac
et comprend des informations de débogage dans les fichiers de classe: Le Langage Java Les Options Du Compilateur.Par exemple:
-g
génère toutes les informations de débogage, y compris les variables locales.Vous avez besoin à considérer qu'un autre programme, le débogueur -- est accroché dans votre programme et de le regarder pour des choses comme des exceptions. C'est également la surveillance de la ligne en cours afin de réagir à des points d'arrêt ou à la demande des utilisateurs des interruptions (comme une demande d'interruption ou de regarder l'état).
Débogage du code optimisé produit par l'équipe serait très difficile, car il n'y a pas une relation directe entre une gamme de native des instructions et une ligne de code Java comme il existe une relation entre une gamme de bytecode Java et une ligne de code Java.
Sorte de rupture dans une fonction dans le débogueur forces de la JVM pour deoptimize la méthode que vous avancerez dans. Hotspot ne génère pas de code natif à tous et juste interprète le bytecode de la méthode.
Avant JDK 1.4.1 départ avec le débogage activé forcé la JVM de n'utiliser que l'interprète: http://java.sun.com/products/hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_3.html#full
Tip Top: dans l'IDÉE que vous pouvez utiliser ALT+F9 pour exécuter à l'endroit où se trouve le curseur placé plutôt que de définir un point d'arrêt supplémentaire.
J'ai trouvé pour l'anecdote que le débogage devient très lente dans l'IDÉE si vous êtes à pied à l'aide de code où il y a beaucoup de données accessible à partir de la pile. N'oubliez pas, l'IDÉE recueille ces données (ce qui se trouve actuellement dans la portée lexicale) et le présente à vous comme un arbre d'objets à parcourir si vous êtes "regarder" ou pas et est-ce à chaque étape ultérieure (peut-être qu'il re-crée l'arbre à chaque fois?).
Cela est particulièrement évident lorsque, par exemple, il ya une grande collection comme une variable d'instance de la "actuelle" de l'objet.
Si vous utilisez Java 5, le paramètre pour le débogage est :
-agentlib:jdwp=transport=dt_socket,serveur=y,suspendre=n,address=
et avant Java 5
-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,serveur=y,suspendre=n