titledborder setborder propiedades create java debugging jboss intellij-idea

setborder - textarea java propiedades



¿Por qué el código Java se ralentiza en el depurador? (7)

Algunas rutinas intensivas de CPU se vuelven dramáticamente más lentas cuando se ejecutan a través de un depurador. ¿Por qué es esto?

Porque el JITter no optimizará tanto el código (a menudo, en absoluto) cuando la depuración está habilitada.

Algunas rutinas intensivas de CPU se vuelven dramáticamente más lentas cuando se ejecutan a través de un depurador. ¿Por qué es esto?

Actualmente solo uso IntelliJ para recorrer el código que se ejecuta en JBoss. Cuando comienzo a JBoss, uso estas opciones:

set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MaxPermSize=256m -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n %JAVA_OPTS%

¿Hay alguna manera de acelerar la ejecución? ¿O para acelerar ciertas ejecuciones de métodos que no necesito pasar?

Actualización : parece que si no paso por encima de las rutinas intensivas de la CPU (es decir, simplemente ejecuta hasta un punto de interrupción establecido justo después de la rutina), entonces el tiempo de ejecución es como si no estuviera en un depurador.


Al depurar, además de ejecutar su aplicación, también está ejecutando un depurador.

El código se compila en modo de depuración con símbolos de metadatos sobre variables locales y otra información de nivel de fuente. El depurador lee para saber qué línea del código fuente corresponde con la instrucción actual. El proceso se llama depuración simbólica . Los símbolos almacenados aumentan el tamaño del código y su interpretación aumenta el tiempo de ejecución.

Algunos depuradores interpretan realmente el código sobre la marcha, que casi siempre es un gran éxito de rendimiento.

Más información sobre el modo de compilación de depuración de Java, que es realizado por javac e incluye información de depuración en los archivos de clase : Opciones del compilador de lenguaje Java . Por ejemplo: -g genera toda la información de depuración, incluidas las variables locales.


Debe tener en cuenta que otro programa, el depurador, está conectado a su programa y lo está observando en busca de excepciones. También está monitoreando la línea actual para reaccionar ante puntos de interrupción o interrupciones solicitadas por el usuario (como una solicitud de pausa o una condición de reloj).


Depurar el código optimizado producido por el JIT sería muy difícil, ya que no existe una relación directa entre un rango de instrucciones nativas y una línea de código Java, ya que existe una relación entre un código de bytes Java y una línea de código Java .

Así que entrar en una función en el depurador obliga a la JVM a desoptimizar el método por el que está pasando. Hotspot no genera código nativo en absoluto y solo interpreta el código de bytes del método.

Antes de que JDK 1.4.1 comenzara con la depuración habilitada, JVM solo usaba el intérprete: http://java.sun.com/products/hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_3.html#full


Si usa Java 5, el parámetro para la depuración es:

-agentlib: jdwp = transporte = dt_socket, servidor = y, suspender = n, dirección =

y antes de Java 5

-Xdebug -Xrunjdwp: transporte = dt_socket, dirección = 5005, servidor = y, suspender = n


Sugerencia principal: en IDEA, puede usar ALT + F9 para correr hacia donde se encuentra el cursor en lugar de establecer un punto de interrupción adicional.

Descubrí anecdóticamente que la depuración se vuelve muy lenta en IDEA si está recorriendo un código donde hay una gran cantidad de datos accesibles desde la pila. No lo olvide, IDEA recopila estos datos (cualquier cosa que se encuentre actualmente en el ámbito léxico) y los presenta a usted como un árbol de objetos para examinar si está "observando" o no, y lo hace en cada paso subsiguiente (tal vez, crea el árbol cada vez?).

Esto es especialmente evidente cuando, por ejemplo, hay una gran colección como variable de instancia del objeto "actual".


También depende del "estilo de puntos de interrupción". Por ejemplo, tener puntos de observación en las variables o poner puntos de interrupción en el nivel de la interfaz (el depurador se detendrá en todas las implementaciones de métodos cuando se ejecuten) a menudo reduce drásticamente el tiempo de proceso.