Principios y lectura del código fuente
QuickJS utiliza un método de recuento de referencias para determinar si un objeto se puede liberar. El método de recuento de referencias es muy sencillo. Al asignar un temporizador a un objeto, se guarda el número de veces que se hace referencia al objeto. Si otro objeto hace referencia al objeto, auméntalo en 1. Disminuye en 1 si se elimina la referencia. Cuando el contador de referencia llegue a 0, se reciclará.
JSRuntime es el entorno de ejecución más bajo de QuickJS y debe lanzarse a tiempo cuando no esté en uso.
Un JSRuntime puede crear múltiples contextos. Cada contexto está aislado entre sí y debe publicarse a tiempo cuando no esté en uso.
Si necesita crear y asociar objetos js usted mismo y necesita lidiar con problemas de referencia, debe crear un objeto JSValue a través de C y luego debe liberarlo manualmente; de lo contrario, provocará múltiples pérdidas de memoria. Las versiones no funcionarán y también provocarán punteros Wild, lo que provocará que el programa falle. Si simplemente ejecuta un script JS, no necesita preocuparse por este problema, el motor ya se ha ocupado de ello.
Por el ejemplo anterior, sabemos que el método de recuento de referencias es registrar la referencia + 1 a través de JS_DupValue, restar 1 de la referencia a través de JS_FreeValue y luego analizar cómo implementarlo a través del código fuente.
El encabezado del contador de referencias es una estructura que actualmente tiene solo un valor int, que se utiliza para registrar el número de referencias a un objeto.
Contador de referencia +1
JS_FreeValue maneja el contador de referencia -1. Si la referencia pertenece a menos de 0, se producirá la recolección de basura. Esto introduce el mayor problema con los contadores de referencia. Si A se refiere a B y B también se refiere a A, ¿esta aplicación mutua dará como resultado que ni A ni B puedan reciclarse?
La función JS_RunGC se utiliza para resolver problemas de referencias cruzadas y se activará en un momento específico.
Una vez completadas las dos funciones anteriores, tmp_obj_list solo tendrá objetos referenciados en el anillo, gc_free_cycles() reciclará los objetos en tmp_obj_list y la referencia al atributo es -1.