Recolección de basura en Golang
El tema de la clasificación de la basura se ha vuelto muy popular recientemente y muchas personas tienen dolor de cabeza debido al problema de la clasificación de la basura. Debido al tema de la basura, quería hablar sobre la basura en Golang, así que se me ocurrió este blog, Recolección de basura en Golang.
En esta etapa, ya hay muchos análisis sobre la recolección de basura de Golang en Internet, por lo que no necesito explicarlo en detalle. Sigue siendo el mismo principio. los términos más sencillos sobre cómo se recolecta la basura.
En primer lugar, usaremos GC en lugar de recolección de basura en el resto de este artículo.
Sabemos que al crear un objeto se le asignarán recursos de memoria. Si este objeto ya no se usa, pero este recurso de memoria siempre está ocupado, nuestra computadora pronto se llenará, por lo que necesitamos Estos. Los objetos de basura se reciclan.
Para reciclar debemos saber qué es basura y qué no es basura.
En nuestra opinión, si un objeto ya no se utiliza, es basura.
Desde la perspectiva del programa, si no se hace referencia a un objeto, es basura.
En primer lugar, déjame explicarte que la parada que se menciona a continuación es todo STW, detiene el mundo, el mundo entero se suspende y todo lo que se ejecuta se detiene.
Permítanme decirles a todos primero, deténganse por un momento y déjenme registrar el estado actual.
Dile a todos, continúa, haz lo que tengas que hacer, yo marcaré los objetos a usar.
Al principio, todos los puntos son blancos Primero, comienza desde el. nodo raíz y marque los puntos conectados son grises (la conexión demuestra que hay referencias) y todos los puntos grises se almacenan
Dígales a todos que se detengan nuevamente, porque todos continúan. Para que funcione, se generará nueva basura, porque el primer proceso registra el estado, por lo que la nueva basura debe marcarse y luego se borran todos los puntos blancos, porque nadie hace referencia a los puntos blancos, es decir, basura;
Debes tener esta pregunta:
Entonces, dado que causará tantos problemas, ¿por qué no simplemente detenerte y comenzar de nuevo después de marcar y reciclar?
Porque es lento~
El motivo de este GC es garantizar que el GC se ejecute de manera normal y eficiente, y que no se pueda detener por mucho tiempo.
De hecho, cuando se detuvo por primera vez, se inició una barrera de escritura, que necesita registrar los objetos recién creados en el proceso posterior.
Este proceso se llama tres. -Marcado de color, que es un poco similar a la búsqueda en amplitud.
Esta vez se debe detener porque la referencia cambiará durante el segundo proceso, por lo que es necesario escanearlo nuevamente después de detenerlo, luego se apaga la barrera de escritura y finalmente se limpia.
se requiere stw al activar la barrera de escritura
se necesita stw antes de desactivar la barrera de escritura
Se ejecuta el proceso de marcado después de activar la barrera de escritura al mismo tiempo que otros programas
El proceso de limpieza después de desactivar la barrera de escritura se ejecuta al mismo tiempo que otros programas
Después de todo, GC todavía necesita STW Aunque el tiempo de parada puede ser corto, por ejemplo. El programa, si todo el programa se detiene durante 1 segundo, no será bueno para el usuario. Es un golpe fatal. Por lo tanto, GC definitivamente necesita una condición desencadenante y no puede suceder justo cuando lo desee.
Esta es una condición de activación. La configuración de porcentaje de GC predeterminada es 100, lo que significa que si la memoria total ocupada después de este reciclaje es de 2 M, la siguiente condición de activación excederá los 4 M de manera similar; reciclaje, el área total ocupada es 4M, entonces la siguiente condición de activación será 8M.
Esto es simple: active GC cuando no se haya ejecutado ningún GC durante un cierto período de tiempo (2 minutos)
Utilice el comando runtime.GC() para activar GC manualmente p>
Eso es todo El proceso general de recolección de basura en golang generalmente usa el método de marcado de tres colores para eliminar la marca, y la marca se ejecuta en paralelo con el programa. Para resolver el problema, se utiliza una barrera de escritura. para registrar los cambios en el objeto durante el proceso de marca. En términos generales, también es para mejorar la eficiencia de la recolección de basura y reducir el tiempo de STW tanto como sea posible.
Después de comprenderlo, en comparación con el reciclaje generacional de Java, el algoritmo de reciclaje en golang es más simple de entender.
/articles/21569
/2014/09/03/visualizar-algoritmos-de-recolección-de-basura/
/p/8b0c0f7772da
/2017/04/28/golang-gc/