Categorías
Otros

Herramienta de monitoreo de ajuste del rendimiento de JVM

# jdk version
[[email protected] ~]# java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)

1. jps (Java Virtual Machine Process Status Tool): herramientas básicas

jps se utiliza principalmente para generar información de estado del proceso que se ejecuta en la JVM.

  • Gramática
jps [options] [hostid]
  • Parámetro
Parámetro Descripción
-q No genere el nombre de la clase, jar name y los parámetros pasados al método principal
-m Salida de los parámetros pasados al método principal
-l Salida del nombre completo de la clase principal o Jar
-v Generar los parámetros pasados a la JVM
  • Ejemplo
[[email protected] ~]# jps -ml
11252 test-jvm.jar
11579 sun.tools.jps.Jps -ml

Dos, jstack

jstack se utiliza principalmente para ver la información de la pila de subprocesos en un proceso Java. Jstack puede localizar la pila de subprocesos. De acuerdo con la información de la pila, podemos localizar el código específico. También se utiliza a menudo para eliminar interbloqueos. Por lo tanto, se utiliza mucho en la optimización del rendimiento JVM.

  • Gramática
jstack [option] pid
jstack [option] executable core
jstack [option] [[email protected]]remote-hostname-or-ip
  • Parámetro
Parámetro Descripción
-F Cuando no se responda a la solicitud de salida normal, forte la pila de subprocesos de salida
-m Si se llama al método local, se puede mostrar la pila de C/C++
-l Además de la pila, se muestra información adicional sobre el bloqueo. Cuando se produce un interbloqueo, puede utilizar jstack -l pid para observar la situación de retención de bloqueo
  • Ejemplo
[[email protected] ~]# jstack 26563
............Omit
"http-nio-8080-exec-1" #13 daemon prio=5 os_prio=0 tid=0x00007f66fca4f800 nid=0x67d1 runnable [0x00007f66d85be000]
   java.lang.Thread.State: RUNNABLE
	at top.dongxibao.demo.controller.TestJvm.testJstack1(TestJvm.java:51)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
............Omit

3. jmap (Mapa de memoria) y jhat (Herramienta de análisis de montón de Java)

Jmap puede ver la información de inicialización de la memoria del montón y el uso de la memoria del montón, y también puede generar un archivo de volcado para un análisis detallado. A continuación, utilice jhat para analizar

  • Gramática
jmap [option] pid
jmap [option] executable core
jmap [option] [[email protected]]remote-hostname-or-ip
  • Parámetro
  Instalación y uso de Apache Jmeter
Parámetro Descripción
heap Mostrar detalles del montón de Java
histo[:live] Mostrar estadísticas de objetos en el montón
clstats Información del cargador de clases de impresión
finalizerinfo Muestre los objetos de la cola de F-Queue a la espera de que el subproceso Finalizador ejecute el método finalizador
dump:<dump-options> Generar instantánea de volcado de montón
  • Ejemplo

Ver información de pila

[[email protected] ~]# jmap -heap 27111
Attaching to process ID 27111, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.271-b09

using thread-local object allocation.
Mark Sweep Compact GC

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 104857600 (100.0MB)
   NewSize                  = 34930688 (33.3125MB)
   MaxNewSize               = 34930688 (33.3125MB)
   OldSize                  = 69926912 (66.6875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 31457280 (30.0MB)
   used     = 16189512 (15.439521789550781MB)
   free     = 15267768 (14.560478210449219MB)
   51.46507263183594% used
Eden Space:
   capacity = 27983872 (26.6875MB)
   used     = 13296472 (12.680503845214844MB)
   free     = 14687400 (14.006996154785156MB)
   47.514768506659834% used
From Space:
   capacity = 3473408 (3.3125MB)
   used     = 2893040 (2.7590179443359375MB)
   free     = 580368 (0.5534820556640625MB)
   83.29110775353773% used
To Space:
   capacity = 3473408 (3.3125MB)
   used     = 0 (0.0MB)
   free     = 3473408 (3.3125MB)
   0.0% used
tenured generation:
   capacity = 69926912 (66.6875MB)
   used     = 9052064 (8.632720947265625MB)
   free     = 60874848 (58.054779052734375MB)
   12.945036097118088% used

11274 interned Strings occupying 938016 bytes.

Generar el archivo de volcado de instantáneas de volcado de montón y utilizar jhat para ver

[[email protected] ~]# jmap -dump:format=b,file=/tmp/dump.dat 27111
Dumping heap to /tmp/dump.dat ...
Heap dump file created
# -J-Xmx512m limit the maximum memory
[[email protected] ~]# jhat -J-Xmx512m -port 9999 /tmp/dump.dat 
Reading from /tmp/dump.dat...
Dump file created Sat Nov 28 17:41:33 CST 2020
Snapshot read, resolving...
Resolving 194937 objects...
Chasing references, expect 38 dots......................................
Eliminating duplicate references......................................
Snapshot resolved.
Started HTTP server on port 9999
Server is ready.

Cuatro, jstat (herramienta de monitoreo estadístico JVM)

Puede detectar la situación en tiempo real de la ejecución del programa Java, incluida la información de memoria del montón y la información de recolección de elementos no utilizados, a menudo se utiliza para ver la situación de recolección de elementos no utilizados del programa.

  • Gramática
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
  • Comandos comunesjstat -gc pidCampo de información
  La secuencia de comandos de Python llama a robotframework case _Robot Framework automated test (1) --- el primer script
Parámetro Descripción
S0C La capacidad de Supervivientes en la generación joven (en KB)
S1C La capacidad de From Survivor en la generación joven (en KB)
S0U To Survivor in the young generation actualmente usaba espacio (en KB)
S1U De Survivor en la generación joven actualmente utilizado espacio (en KB)
EC La capacidad del Edén en la generación joven (en KB)
EU Eden en la generación joven actualmente utiliza el espacio (en KB)
OC Capacidad de la generación anterior (en KB)
OU Espacio actualmente utilizado en la vejez (en KB)
MC La capacidad del metaespacio (en KB)
MU Metaspace actualmente utilizado espacio (en KB)
YGC El número de gc en la generación joven desde el inicio de la aplicación hasta el muestreo
YGCT El tiempo empleado por gc en la generación joven desde el inicio de la aplicación hasta el tiempo de muestreo (s)
FGC Desde el inicio de la aplicación hasta el tiempo de muestreo de la generación anterior (Full Gc) gc times
FGCT El tiempo que se tarda desde el inicio de la aplicación hasta el muestreo de la generación anterior (Full Gc) gc (s)
GCT El tiempo total utilizado por gc desde el inicio de la aplicación hasta el momento del muestreo (s)
  • Ejemplo
[[email protected] ~]# jstat -gc 27111
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
3392.0 3392.0  0.0    0.0   27328.0   1047.1   68288.0    11389.2   30080.0 28101.5 3968.0 3585.8     13    0.057   2      0.040    0.097

Seis, ejemplos

1. Pérdida de memoria

  • Código de prueba java
/**
 * Simulate memory leak
 */
@GetMapping(value = "/memory/leak")
public String testMemoryLeak() {
    System.out.println("Simulated memory leak");
    for (int i = 0; i < 5000; i++) {
        ThreadLocal<Byte[]> localVariable = new ThreadLocal<Byte[]>();
        // add variables to the thread
        localVariable.set(new Byte[4096 * 1024]);
    }
    return "ok";
}
  • Ejecutar la interfaz de acceso al proyecto
# Use the command line to add the heap memory size limit, and set the output stack snapshot and log output when the memory overflows.
[[email protected] ~]# java -jar -Xms100m -Xmx100m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/tmp/heaplog.log test-jvm.jar
[[email protected] ~]# curl localhost:8080/memory/leak
  • Mensaje de error
java.lang.OutOfMemoryError: Java heap space
  • Usojstat -gc pid Comando para ver la situación gc del programa
[[email protected] ~]# jstat -gc 27871
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
3392.0 3392.0  0.0   568.8  27328.0  27328.0   68288.0    55987.3   31232.0 29113.5 4096.0 3708.6     18    0.085   3      0.121    0.206
  • Análisis generado.hprofArchivo
  {1} orientadas a objetos Java

Use la propia herramienta java visual vm de JDK para ver en Windows

Eclipse plug-in MAT y idea plug-in jProfiler también se pueden analizar

2. Encuentre el hilo Java que consume más CPU en un determinado proceso Java y localice la información de la pila

  • código de prueba java
/**
   * Test jstack
 */
@GetMapping(value = "/cpu/loop")
public String testCpuLoop() {
    while (true) {
        //Do Nothing
    }
}
  • Ejecutar la interfaz de acceso al proyecto
[[email protected] ~]# java -jar -Xms100m -Xmx100m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/tmp/heaplog.log test-jvm.jar
[[email protected] ~]# curl localhost:8080/cpu/loop
  • Ver id de proceso
[[email protected] ~]# jps
26563 jar
26589 Jps
  • Encuentra el hilo que consume más CPU según el id de proceso

  • Convierte el hilo que consume más CPU a hexadecimal

[[email protected] ~]# printf "%x" 26577
67d1
  • jstack encuentra información sobre este hilo
# -A 10 means to find the last 10 lines of the line
[[email protected] ~]# jstack 26563 | grep -A 10 67d1
"http-nio-8080-exec-1" #13 daemon prio=5 os_prio=0 tid=0x00007f66fca4f800 nid=0x67d1 runnable [0x00007f66d85be000]
   java.lang.Thread.State: RUNNABLE
	at top.dongxibao.demo.controller.TestJvm.testJstack1(TestJvm.java:51)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)

Artículo de referencia

https://mp.weixin.qq.com/s/w61tw4qHY2AvJqmp_oZI7A

https://mp.weixin.qq.com/s/fcYbt3wUhcZlBeZy0RfgGQ

.

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *