leaks when using primitives; fixable with WeakRef
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- javascript
- Área
- data
Línea de trabajo
Comienza localizando las implementaciones de Tuple y UniversalWeakMap, y luego sigue cómo Tuple(primitive) crea y conserva nodos padre. Compara las referencias fuertes actuales con el enfoque propuesto de WeakRef, FinalizationRegistry y WeakMap global. Se considera terminado cuando las tuplas y sus mapas ya no retienen memoria después de la recolección de basura, incluidos distintos tipos de tuplas de valores primitivos.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
The description claims "no leaks", but if you do Tuple(primitive), that creates a UniversalWeakMap which can never be garbage collected. If you're creating a lot of tuples with a lot of different primitives, that can be a problem.
Now that we have WeakRef and FinalizationRegistry, I'm pretty sure it's possible to do better, so that there's actually no leaks: that is, no matter how many tuples you create and how you create them, once they've all been GC'd you're guaranteed that no additional memory is held.
The necessary changes are:
- When
set(key, value)is called on aUniversalWeakMap, store aWeakReftovalueinstead of storingvaluedirectly, and registervaluein aFinalizationRegistryso that when it is collectedkeyis cleared from the map. - Use a global
WeakMapto store a map from each created tuple to all of its parent nodes.
Then the only strong references to UniversalWeakMap objects (except the root) are from the tuples stored in those maps. Once all the tuples stored in a given UniversalWeakMap are GC'd, it can be GC'd as well.
The only caveat with this approach is if the user uses a tuple as a key in a weak collection. In that case the tuple can still get collected even if it was only holding primitives, which might be surprising. But that's unavoidable if avoiding leaks.
- Lenguaje dominante
- JavaScript
- Estrellas
- 38
- Forks
- 3
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de benjamn/immutable-tuple
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
benjamn/immutable-tuple#10 ·
-
-0 is not normalizedAbierto
Dificultad 3/5 1-2 días Aptitud para principiantes 42/100
-
Expose Universal WeakMapAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 35/100
benjamn/immutable-tuple#6 · 2 comentarios · 1 reacción ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 20/100
-
module is not definedAbierto
Dificultad 3/5 1-2 días Aptitud para principiantes 30/100
Todos los issues de benjamn/immutable-tuple
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Automattic/node-canvas#2633 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
capricorn86/happy-dom#2594 ·
Los mantenedores suelen responder en 1 día
-
Decoding tag 1 (epoch date) with an 8-byte integer throws "Cannot mix BigInt and other types"Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
microsoft/monaco-editor#5575 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
Los mantenedores suelen responder en 1 día