Este artículo es un artículo exclusivo de la serie "You Don't Know 5 ..." para DevelopersWorks. Sin embargo, pocos de nosotros podemos entender cómo los JVM hacen su trabajo, como la asignación de tareas y la recolección de basura, girar hilos, abrir y cerrar archivos, interrumpir y/o JIT compilando el byto de Java, etc.
No estar familiarizado con el JVM no solo afectará el rendimiento de la aplicación, sino que también intentará solucionarlo cuando haya un problema con el JVM.
Este artículo presentará algunos indicadores de línea de comandos que puede usar para diagnosticar y ajustar el rendimiento de su máquina virtual Java.
1.disablexplicitgc
No recuerdo cuántas veces el usuario me pidió que consultara sobre los problemas de rendimiento de la aplicación.
Listado 1. System.gc ();
La copia del código es la siguiente:
// Acabamos de lanzar un montón de objetos, así que dígale al estúpido
// Recolector de basura para recogerlos ya!
System.gc ();
La recolección de basura explícita es una muy mala idea, como encerrarte y un bulldog loco en una cabina telefónica. Aunque la sintaxis de la llamada se implementa de manera dependiente, si su JVM está ejecutando un recolector de basura generacional (principalmente System.gc (); obliga a la VM a realizar un "barrido" del montón, aunque algunos no son necesarios. Toda la limpieza es pedidos de magnitud más caros que una operación regular de GC, y es solo un problema matemático simple.
No puede tomar mis palabras en serio: los ingenieros de Sun proporcionan un indicador JVM para este error manual especial; Puede ver si System.gc () es dañino o beneficioso para toda la ejecución de JVM.
2.HeapdumponoutofMemoryError
¿Alguna vez ha experimentado una situación en la que el JVM no se puede usar, tirar constantemente fuera deMemoryError, y no puede crear un depurador para usted para atraparlo o ver qué está mal? Problemas serios y/o inciertos como este a menudo vuelven locos a los desarrolladores.
El comprador es responsable de su propio
No todos los indicadores de línea de comando son compatibles con cualquier VM, excepto las máquinas virtuales Sun/Oracle. La mejor manera de averiguar si es compatible con una bandera es probarla y ver si funciona correctamente. Si estos logotipos no son técnicamente compatibles, entonces usted es totalmente responsable de usarlos. Yo, Sun/Oracle e IBM no serán responsables si alguno de estos indicadores hace que su código, sus datos, su servidor o todo sobre usted desaparezcan sin dejar rastro. Por si acaso, se recomienda experimentar primero en un entorno virtual (muy producción).
Lo que quieres en este momento es capturar una instantánea del montón cuando el JVM muere, solo el comando -xx:+HeapDumponoutofMemoryError puede hacer esto.
Ejecutar el comando notifica que el JVM tome una "instantánea de volcado de montón" y guárdela en un archivo para procesar, generalmente utilizando la utilidad JHAT (lo describí en la publicación anterior). Puede especificar la ruta real al archivo guardado utilizando el indicador -xx: Heapdumpath correspondiente. (No importa dónde se guarde el archivo, asegúrese de asegurarse de que el sistema de archivos y/o los procesos Java deben tener permisos para configurar y se pueden escribir allí).
3.BootClasspath
Es útil poner una clase en un classpath regularmente, que es ligeramente diferente del classpath que viene con el inventario JRE o el JRE Classpath que se extiende de alguna manera. (El nuevo proveedor de API de Java Crypto es un ejemplo). Si desea extender JRE, su implementación personalizada debe poder usar el cargador de clases de Bootloader, que puede cargar java.lang.object en rt.jar y todos sus archivos relacionados.
Aunque puede abrir ilegalmente RT.jar y mover su implementación personalizada o sus nuevos paquetes, técnicamente violó el acuerdo que acordó al descargar el JDK.
En su lugar, use la opción de JVM -xBootClassPath, así como la Skins -xbootClassPath/P y -xbootclasspath/A.
-Xbootclasspath le permite establecer una classpath de arranque completa (esto generalmente incluye una referencia a RT.jar), así como algunos otros archivos JAR accesibles por JDK (no parte de RT.jar). -Xbootclasspath/p precede al valor en el bootclasspath existente y agrega -xbootclasspath/a.
Por ejemplo, si modificó el Java.lang.integer en la biblioteca y colocó la modificación en un Subpath Mods, el parámetro -xbootclasspath/amods coloca el nuevo entero antes de los parámetros predeterminados.
4. Verboso
Para virtual o cualquier tipo de aplicación Java, -verbose es una aplicación de diagnóstico útil de primer nivel. El logotipo tiene tres sub-logoes: GC, clase y JNI.
Los desarrolladores intentan averiguar si el recolector de basura JVM falla o causa un bajo rendimiento. Desafortunadamente, explicar la salida de GC es engorroso, lo suficiente como para escribir un libro. Peor aún, la salida impresa en la línea de comando cambia en diferentes versiones de Java o no en diferentes JVM, lo que hace que sea más difícil interpretarlo correctamente.
En términos generales, si el recolector de basura es un coleccionista generacional (la mayoría de las máquinas virtuales "a nivel empresarial"). Algún tipo de bandera virtual aparecerá para indicar una ruta GC de barrido completa;
La clase puede ayudarlo si desea diagnosticar los cargadores de clases y/o conflictos de clase no coincidentes. No solo informa cuándo se carga la clase, sino también dónde se carga la clase, incluida la ruta al frasco (si desde el frasco).
JNI rara vez se usa, excepto cuando se usa JNI o bibliotecas locales. Cuando se abre, informará varios eventos JNI, como cuando se carga la biblioteca local, y cuando el método se recupere;
5. Command-line-x
He enumerado las opciones de línea de comando que me gustan en el JVM, pero hay algunas cosas más que necesitas encontrar, ejecutando el argumento de la línea de comandos -x, enumerando todos los no estándar (pero en su mayoría seguros) proporcionados por el JVM ) Parámetros - Por ejemplo:
-Xint, ejecutando el JVM en modo interpretado (que es útil para probar si el compilador JIT realmente funciona para su código o verificando si hay un error en el compilador JIT).
-Xloggc:, y -verbose: GC hace lo mismo, pero registre un archivo sin emitirlo a la ventana de la línea de comando.
Las opciones de línea de comandos JVM cambian de vez en cuando, por lo que es una buena idea verificarlo regularmente. Incluso miras el monitor a altas horas de la noche y te vas a casa a las 5 p.m. para cenar con tu esposa e hijos (o destruyen a tus enemigos en Mass Effect 2, dependiendo de tu preferencia), todos son diferentes.
Conclusión
En los entornos de producción, los indicadores de la línea de comandos no están diseñados para uso permanente; de hecho, a excepción de las banderas que terminan para ajustar el recolector de basura JVM, no se dedica ningún indicador de línea de comandos no estándar al uso de producción. Sin embargo, es muy útil como herramienta para espiar el trabajo interno de las máquinas virtuales que de otro modo son completamente opacas.