pantalla - Uso de-noverify al iniciar aplicaciones java
spring executable jar (6)
El tiempo de inicio solía ser un problema. Sin embargo, los verificadores ahora son más rápidos, al igual que los procesadores. El código compilado con JDK6 javac incluirá de forma predeterminada información adicional para acelerar el paso del verificador. Apache Harmony solo usa un algoritmo de verificación mucho más rápido.
Algunas versiones muy antiguas de javac producen bytecode incorrectos. De hecho, Sun PlugIn incluye un código de reparación para verificar la existencia de algunos archivos de clase rotos.
He visto muchas aplicaciones que toman clases de instrumentos y toman -javaagent
como un param al cargar también ponen un -noverify
en la línea de comando.
El documento de Java dice que -noverify
desactiva la verificación de clase.
Sin embargo, ¿por qué alguien querría desactivar la verificación incluso si están instrumentando clases?
Hora de inicio, diría. La verificación de que las clases son correctas lleva algún tiempo cuando se carga la clase. Dado que las clases pueden cargarse de manera perezosa (no en el inicio de la aplicación, pero cuando se usan por primera vez), esto puede causar retrasos de tiempo de ejecución inesperados y no deseados.
En realidad, la clase no necesita ser revisada en general. El compilador no emitirá ningún bytecode o construcción de clase inválidos. El motivo de la verificación es que la clase puede estar basada en un sistema, alojada en línea y transmitida a través de Internet sin protección. En esta ruta, un atacante malicioso podría modificar el bytecode y crear algo que el compilador nunca podría crear; algo que puede bloquear la JVM o posiblemente evitar las restricciones de seguridad. Por lo tanto, la clase se verifica antes de ser utilizada. Si se trata de una aplicación local, generalmente no es necesario volver a comprobar el bytecode.
Depuración De hecho, eso es lo que estoy haciendo ahora, y cómo me encontré con esta pregunta. En Terracotta hacemos una gran cantidad de instrumentación de código de bytes, y a veces ayuda a desactivar el verificador a medida que depuramos nuestros adaptadores de clase, para que podamos ver dónde fallan exactamente en el tiempo de ejecución.
Tienes razón, queremos que el verificador permanezca en producción.
El uso de JRebel sin -noverify
dará esta advertencia al inicio:
JRebel: ''-noverificar'' falta, cambiar / agregar / eliminar constructores no estará habilitado!
De modo que parece que -noverify
permite que la -noverify
bytecode haga algunas cosas que de otro modo no serían posibles.
Cuando se usa junto con -javaagent
, lo más probable es que no sea por motivos de rendimiento, sino porque el agente crea intencionalmente bytecode "no válido".
Se debe tener en cuenta que el bytecode inválido aún puede ejecutarse correctamente, porque algunas de las reglas de verificación son bastante estrictas. Por ejemplo, no se debe acceder a esto en un constructor antes de llamar al superconstructor, porque las variables no se inicializan en este punto. Pero aún puede haber otras cosas que desee hacer (vea el ejemplo de JRebel). Luego, usa -noverify
para eludir esa regla.
El nuevo verificador que se introduce en JAVA 6 es muy complicado de procesar para manipulaciones de código.
Eche un vistazo a esto: http://chrononsystems.com/blog/java-7-design-flaw-leads-to-huge-backward-step-for-the-jvm
y el informe de error relacionado: http://bugs.sun.com/view_bug.do?bug_id=8009595