Inesperadamente, este error mágico me hizo trabajar hasta altas horas de la noche.

Autor | Supervivencia en una isla desierta

Fuente | La supervivencia de Coder en la isla desierta (ID: escape-it)

Me gustaría compartir con ustedes un problema en línea resuelto recientemente. La razón es esta. Recientemente participé en un proyecto de la empresa y la cantidad de trabajo fue muy grande. Después de que el código fue escrito y probado, finalmente llegó a un tiempo en línea tenso.

Proyecto online

Antes de conectarme, estaba ansioso como de costumbre, porque el proyecto es relativamente grande, la estimación puede no ser muy fluida, pero no es suficiente rezar para que el servidor no tenga errores, los errores son algo común para los programadores y puede que no haya errores. Murmurando durante mucho tiempo, esta es una enfermedad profesional, no tiene cura.

Después de estar nerviosa por un tiempo, contuve la respiración y presioné el botón en línea. En ese momento, fue como presionar el botón nuclear. Tenía miedo de que el servidor explotara después de hacer clic en él.

Resultó que todo era normal ...

Esto no es correcto. En este momento, la enfermedad ocupacional del blogger se ha vuelto a cometer. Un cambio tan grande no será tan suave, ¿no? Memoria, CPU, tp99, todo es normal, esto es demasiado anormal.

Di que Cao Cao Cao Cao estará allí

Justo cuando el blogger se preguntaba por qué no había ningún error, el error vino como si hubiera escuchado mi llamada. El blogger incluso estaba pensando en ¿por qué el billete de lotería de 5 millones en su sueño era tan desobediente?

Todo era normal al comienzo del lanzamiento, pero el problema ocurrió en el siguiente período de tiempo.

En el tiempo siguiente, tp99 consumió mucho tiempo y fue imparable en aumento como la inflación, y los ingresos en línea fueron tan imparables como el mercado de valores.

En este momento, el corazón del blogger está más tranquilo, así es, es el sabor, la receta familiar o el sabor familiar, lo sé.

Deje de decir tonterías y retroceda rápidamente. Una vez que la conexión a Internet vuelva a la normalidad, el siguiente paso es solucionar el problema.

Solucionar problemas

Desde el punto de vista de la supervisión, el tiempo de procesamiento de una solicitud será cada vez mayor, por lo que, obviamente, la clave del problema es localizar el fragmento de código que consume mucho tiempo.

No hay forma más que buscar la supervisión poco a poco. Afortunadamente, la supervisión en el código es más rica. Después de una clasificación, finalmente se bloquea en esta línea de código:

// 监控代码

obj a = b;

// 监控代码

¿Qué está haciendo esencialmente este código? Muy simple, es la copia del objeto, y en nuestra implementación sigue siendo una copia superficial, es decir, solo se copian algunos campos.

Desde el punto de vista de la supervisión, esta línea de código provocó el lento aumento de tp99.

Esta. . ¿Cómo es esto posible? Una simple copia de un objeto aumentará mucho el consumo de tiempo y aumentará lentamente con el tiempo, lo cual es asombroso.

Cuando las personas encuentran problemas que no pueden comprender, generalmente se atribuyen a factores externos y los blogueros no pueden evitarlos.

El siguiente es el momento de la duda en la vida.

No es por el problema de monitoreo. No es por el compilador. No es por el hardware. No es por el clima. No es por el feriado del Día Nacional. No es mío. la razón.

Después de pensarlo, la racionalidad finalmente lo derrotó. ¿Cómo pudo haber tantas razones? En la actualidad, parece que fue causado por la copia de este objeto sin otras pruebas.

Entonces, ¿por qué una simple copia de un objeto provoca un consumo de CPU cada vez mayor y más tiempo lleva?

La clave aquí es darse cuenta de esto. Dado que el tiempo se incrementará cada vez más con el tiempo, es obvio que ciertos datos globales se acumulan cada vez más con el procesamiento de la solicitud, y el objeto problemático se utiliza En estos datos globales. Así es, así es, por fin veo la luz, jaja, ¡emocionado!

Esto explica por qué este objeto se ha convertido cada vez más en deuda de EE. UU. Con el tiempo. Aunque es posible que el gobierno de EE. UU. No planee pagar la deuda de EE. UU., La CPU copia cada vez más datos. El tiempo es cada vez más alto.

Encuentra el error

Ahora que la dirección está clara, el siguiente paso será el objetivo.

Primero, echemos un vistazo a las variables miembro de este objeto. No habrá ningún problema con los tipos integrados como int y bool, porque el tamaño de estos tipos de variables es fijo. A lo que debes prestar atención es a este tipo de vector, conjunto y otros contenedores. .

Finalmente, después de algunas inspecciones, se concluyó que el problema era con una variable miembro del vector, y también se verificó la conjetura anterior.

La verdad esta fuera

El problema es este.

Una variable miembro de vector de este objeto debe inicializarse con los datos de otro objeto (se asume que es el objeto A) cada vez que se procesa una solicitud, así:

Antes de que se procese cada solicitud, los datos en poder de A se enviarán con algunos datos específicos.

Para optimizar la sobrecarga de asignación de memoria, el sistema coloca el objeto A en el grupo de memoria, así:

Debido a que el objeto se coloca en la reserva de memoria, el objeto A no se liberará, lo que hace que el objeto A se convierta de manera invisible en un objeto global.

Ahora, algunos estudiantes pueden haber descubierto el problema, es decir, si los datos retenidos por el objeto A no se borran después de ser devueltos al grupo de memoria, entonces causará tal problema, es decir, los datos retenidos por A siguen a cada uno. La llegada de la solicitud está constantemente empujando datos, lo que hará que los Datos retenidos por A exploten como una burbuja, y el vector retenido por el objeto Obj correspondiente también se hará más grande:

En este caso, copiar el objeto Obj debe copiar el vector retenido. A medida que el vector se hace más y más grande, el tiempo dedicado a la copia también aumenta. La intención de usar la reserva de memoria es buena, pero se olvida después de su uso. La limpieza de los datos antiguos que guardó en realidad causó una pérdida de memoria .

Lecciones aprendidas

Esta vez, el problema se ve así desde la perspectiva de la escritura de código. La limpieza del campo de datos en el objeto A no se coloca en la función Borrar del objeto A. En cambio, depende del usuario para limpiar. Debido a que el código es muy complejo y fácil de omitir, el blogger está aquí Es un hoyo aquí. . .

Por tanto, las lecciones aprendidas son:

  1. Cuando agregue un nuevo miembro a la clase, debe prestar atención a su trabajo de limpieza . Antes de usarlo, debe asegurarse de que el miembro sea nuevo y no haya un inventario antiguo anterior en él.

  2. Agregar la supervisión necesaria al código favorece la resolución de problemas.

  3. El tiempo de prueba debe ser un poco más largo, de lo contrario, problemas como este no se expondrán fácilmente.

  4. Es normal que los programadores encuentren errores, hagan suposiciones audaces y verifiquen cuidadosamente que cada vez que se resuelve un problema, es una mejora en la capacidad.

Después de encontrar el problema, corrija el error, realice una prueba automática, verifique y envíe el código de una vez. Será mañana cuando vuelva a conectarse.

Tomó más de 6 horas encontrar el problema en línea por la tarde para resolver el problema.Cuando el blogger llegó a casa, el cielo estaba lleno de estrellas.

Espero que este artículo pueda ayudarlo a evitar algunos errores.

Recomendaciones más interesantes

☞没有 5G 版 iPhone 的苹果秋季发布会,发布了些什么?
☞2020苹果秋季发布会,你最想买什么产品?| 每日趣闻
☞大数据杀熟行为10月1日起明令禁止;阿里一号工程“犀牛制造”正式亮相;iOS 14 正式版发布 | 极客头条
☞ZooKeeper的十二连问,你顶得了嘛?
☞CSDN 创始人蒋涛解读鸿蒙:对开发者究竟意味着什么?
☞我投资比特币的3个原因
点分享点点赞点在看

Supongo que te gusta

Origin blog.csdn.net/csdnsevenn/article/details/108655959
Recomendado
Clasificación