Combate real de depuración de Java

El uso de la CPU es demasiado alto

Otra URL

¿Cómo solucionar problemas de ubicación cuando el uso de la CPU del servidor en línea es alto? _u011277123's blog -CSDN blog
performance optimization and high CPU's blog (1) _Tom cat's blog -CSDN blog
online java program El uso de CPU es demasiado alto solución de problemas_Blog de Vioao-CSDN 博客

¿Qué escenarios necesitan para solucionar problemas de uso de la CPU?

  1. La velocidad de respuesta de la interfaz de acceso es muy lenta.
  2. El sistema se bloquea y no responde
  3. Verifique la CPU, la memoria, la carga, rt, qps y otros indicadores durante la prueba de presión

Método de resolución de problemas

  1. Encuentre el proceso con la CPU más alta.
    El comando superior, anote el número de proceso (PID). Asumiendo que el más alto es: 1893
  2. Encuentra el hilo correspondiente a través del proceso.
    arriba -Hp 1893. Suponiendo que el más alto es: 4519
    (porque Java es multiproceso de un solo proceso)
  3. Busque la información de ubicación aproximada del código a través del hilo.
    printf% x 4519. El resultado es: 11a7
    jstack 1893 | grep 11a7

Operaciones que pueden provocar un aumento en el uso de la CPU

  1. El bucle infinito de while hará que el uso de la CPU aumente
  2. El uso frecuente de Young GC hará que el uso de la CPU aumente
  3. GC frecuente.
    Si el tráfico es muy alto, puede causar una GC frecuente o incluso una GC completa. Cuando el volumen de llamadas es grande, la asignación de memoria será tan rápida que el subproceso GC se ejecutará continuamente, lo que hará que la CPU aumente.
  4. Serialización y deserialización. Más adelante se dará un ejemplo: cuando el programa ejecuta el análisis xml, la cantidad de llamadas aumentará, lo que hará que la CPU se llene.
  5. Expresiones regulares. Me he encontrado con una situación en la que las expresiones regulares llenan la CPU; la razón puede ser que la implementación del motor utilizada por las expresiones regulares de Java es un autómata NFA, que realizará un retroceso durante la comparación de caracteres. Escribí un artículo "Escollos ocultos en las expresiones regulares" para explicar las razones en detalle.
  6. Cambio de contexto de hilo.
    Hay muchos subprocesos iniciados, y el estado de estos subprocesos cambia entre Bloqueado (en espera bloqueado, IO en espera, etc.) y En ejecución. Esta situación puede suceder fácilmente cuando la contención de bloqueos es intensa.

El uso de memoria es demasiado alto

Otra URL

Serie de ubicación del problema de la aplicación Java: uso de memoria demasiado alto: SegmentFault piensa si el
uso de la memoria del servicio Java es demasiado alto, un proceso de resolución de problemas_Hable sobre 1974-CSDN blog_java, el uso de la memoria del servicio
es demasiado alto. blog -CSDN blog

Introducción

El problema de localizar un uso elevado de memoria o pérdidas de memoria en los programas Java es similar al de la CPU. Generalmente, se puede dividir en los siguientes 3 pasos:

  1. Proceso de posicionamiento
  2. Localización de hilo
  3. Código de localización

1. Proceso de posicionamiento

cima

Presione M (ordenar de mayor a menor uso de memoria)

// Suponga que el ID de proceso ubicado es 14279.

2. Colocación del hilo

top -Hp 14279;

Presione M (ordenar de mayor a menor uso de memoria)

top - 18:33:07 up 25 days,  7:48,  1 user,  load average: 0.17, 0.27, 0.23
Threads:  54 total,   1 running,  53 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.5 us,  0.7 sy,  0.0 ni, 98.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8168236 total,   231696 free,  3660496 used,  4276044 buff/cache
KiB Swap:   969964 total,   969964 free,        0 used.  4197860 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
14293 weiping   20   0 4508772  97036  18112 S  10    12 152:35.42 java
14279 weiping   20   0 4508772  97036  18112 S  5.0  1.2   0:00.00 java
14282 weiping   20   0 4508772  97036  18112 S  0.0  1.2   0:00.37 java

Preste atención a dos puntos:

  1. Número de hilos
    1. Como puede ver, su número de subprocesos es 54 (el elemento Subprocesos en la esquina superior izquierda), que es normal.
    2. Si es relativamente grande (por ejemplo, mayor que 1000), considere si hay un problema con el código:
      1. ¿Es porque hay varios subprocesos en el código manualmente? Por ejemplo: cuando se usa OkHttpClient, se crea un grupo de conexiones (ConnectionPool) cada vez; solo se debe crear un grupo de conexiones.
      2. ¿Es demasiado grande el número máximo de grupos de subprocesos creados por usted mismo?
  2. PID de hilo que ocupa una gran cantidad de memoria
    1. Si el número de subprocesos es normal, es necesario volcar la información de la instantánea de la memoria para ver.

3. Busque la ubicación del código

Si se trata de un entorno en línea, tenga en cuenta que el tráfico debe cortarse antes de realizar el volcado; de lo contrario, el volcado de memoria grande bloqueará directamente el servicio.

Volcar la instantánea actual: jmap -dump: format = b, file = dump.hprof 14279

Busque instancias relacionadas con el negocio con una gran cantidad de instancias y luego busque el código correspondiente para ver. (Utilice herramientas para ver dump.hprof. Por ejemplo: MAT, hhat)

Punto muerto

GC completa frecuente

Supongo que te gusta

Origin blog.csdn.net/feiying0canglang/article/details/115105155
Recomendado
Clasificación