# 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
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 comunes
jstat -gc pid
Campo de información
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
- Uso
jstat -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
.hprof
Archivo
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
.